装饰设计模式
/*
装饰设计模式:
当想要对已有的对象进行功能增强时
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能
自定义的该类为装饰类
*/
class Person{ //已有类
public void eat(){
System.out.println("eating");
}
}
class SuperPerson{ //装饰类
private Person p;
SuperPerson(Person p){
this.p=p;
}
public void supereat(){
System.out.print("drinking");
System.out.print("eating");
System.out.print("cake");
System.out.print("sleep");
}
}
class PersonDemo{
public static void main(String[] args){
Person p=new Person();
// p.eat();
SuperPerson sp=new SuperPerson(p);
sp.supereat();
}
}
装饰类通常会通过构造方法接收被装饰的对象
并给予被装饰的对象功能更强的功能
装饰和继承的区别
MyReader//专门用于读取数据的类
继承体系
|--MyTextReader
|--MyBufferTextReader
|--MyMediaReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader
装饰体系
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader
class MyBufferReader extends MyReader{
MyBufferReader(MyReader r){
}
}
装饰模式更加灵活,避免了继承体系的臃肿
降低了类与类之间的关系
装饰类增强已有对象,功能与已有的相同,装饰类与被装饰类属于同一体系
LineNumberReader
import java.io.*;
class LineNumberReaderDemo{
public static void main(String[] args) throws IOException{
FileReader fr=new FileReader("PersonDemo.java");
LineNumberReader lnr=new LineNumberReader(fr);
String line=null;
lnr.setLineNumber(10);
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+line);
}
lnr.close();
}
}
MyLineNumberReader
import java.io.*;
class MyLineNumberReader{
private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r){
this.r=r;
}
public String myReadLine()throws IOException{
lineNumber++;
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=0){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return sb.toString();
}
else{
sb.append((char)ch);
}
}
if(sb.length()!=0){
return sb.toString();
}
return null;
}
public void setLineNumber(int lineNumber){
this.lineNumber=lineNumber;
}
public int getLineNumber(){
return lineNumber;
}
public void myClose()throws IOException{
r.close();
}
}
class MyLineNumberReaderDemo{
public static void main(String[] args)throws IOException{
FileReader fr=new FileReader("PersonDemo.java");
MyLineNumberReader mylnr=new MyLineNumberReader(fr);
String line=null;
while((line=mylnr.myReadLine())!=null){
System.out.println(mylnr.getLineNumber()+":"+line);
}
mylnr.myClose();
}
}