public class Demo5 {
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。装饰者通常是用其他类似于工厂或生成器这样的模式创建的。
/**装饰实际模式:
* 当想要对已有的对象进行功能增强时
* 可以定义类,将已有对象传入,基于已有功能,并提供加强功能
* 那么自定义的该类成为装饰类
*
* 装饰类通常会通过构造方法接收被装饰的对象
* 并基于被装饰的对象的功能,提供更强的功能
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SuperPerson superPerson=new SuperPerson(p);
superPerson.supereat();
}
}
class Person
{
void eat(){
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p;
SuperPerson(Person p){
this.p=p;
}
public void supereat()
{
System.out.println("喝酒");
p.eat();
System.out.println("甜点");
}
}package Excr191;
import java.io.FileReader;
import org.omg.CORBA.PUBLIC_MEMBER;
/*
* MyReader//专门用于读取数据的类
* |MyBufferTextReader
* |MyBufferMediaReader
*
* |MyBufferDateReader
* class MyBufferReader
* {
* MyBufferReader(MyTextReader text)
* MyBufferReader(MyMediaReader media)
* }
* 上述类 扩展性很差
*
* 找其参数的共同类型,通过多态的形式,可以提高扩展性
* class MyBufferREader extends MyReader
* {
* private MyReader r;
* MyBufferReader(MY Reader r)
* ()
* }
* |MyMediaReader
* |MyBufferReader
*
* 装饰模式比继承要灵活,避免了继承体系臃肿
* 而且降低了类与类之间的关系
*
* 装饰类 因为是增强已有对象,具备的功能和已有的是相同点,
* 只不过提供了更强的功能,所以装饰类和被装饰类通常都属于一个体系中
*
*
*
* */
public class Demo6 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
class MyBufferedReader
{
private FileReader reader;
public MyBufferedReader(FileReader reader) {
this.reader=reader;
// TODO Auto-generated constructor stub
}
//可以一次读一行数据的方法
public String myReadLine(){
return null;
//定义一个临时容器,元BufferReader封装的字符数组
//为了演示方便,定义一个StringBuiler容器,因为最终还要把数据编程字符串
StringBuilder sBuilder=new StringBuilder();
int ch=0;
while((ch=reader.read())!=-1){
if (ch==‘\r‘) {
continue;
if (ch==‘\n‘) {
return sBuilder.toString();
}else
sBuilder.append((char)ch);
}
if (sBuilder.length()!=0) {
return sBuilder.toString();
return null;}
}}}
/*覆盖Reader类中的抽象方法
*
*
*
* */
package Excr191;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Demo7 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fileReader =new FileReader("D://1");
LineNumberReader lineNumberReader=new LineNumberReader(fileReader);
String lineString=null;
while ((lineString=lineNumberReader.readLine())!=null) {
System.out.println(lineNumberReader.getLineNumber()+lineString);
}
lineNumberReader.close();
}
}
package Excr191;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Demo8 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fileReader=new FileReader("D://demo.txt");
MyLineNumberReader myLineNumberReader=new MyLineNumberReader(fileReader);
String lineString=null;
while ((lineString=myLineNumberReader.myReadLine())!=null) {
System.out.println(lineString);
}
myLineNumberReader.myClose();
}
}
class MyLineNumberReader
{
private Reader reader;
private int lineNumber;
public MyLineNumberReader(Reader reader) {
// TODO Auto-generated constructor stub
}
public String myReadLine() throws IOException
{ lineNumber++;
StringBuilder stringBuilder=new StringBuilder();
int ch=0;
while ((ch=reader.read())!=-1) {
if (ch==‘\r‘)
continue;
if (ch==‘\n‘)
return stringBuilder.toString();
else
{stringBuilder.append((char)ch);
}
if(stringBuilder.length()!=0)
return stringBuilder.toString();
return null;
}
return null;
}
public void setLineNumber (int lineNumber)
{
this.lineNumber=lineNumber;
}
public int getLineNumber()
{
return lineNumber;
}
public void myClose() throws IOException{
reader.close();
}
}