IO流的Reader,Writer的子类BuffeReader,BuffeWriter分别对FileReader,FileWriter的功能扩展;这种设计模式属于装饰设计模式。
装饰设计模式:当想要对已有的对象进行功能增强时,可以这样定义类,将已有对象传入,基于已有的功能,并提供加强功 能, 那么自定义的该类称为装饰类;装饰类通常会通过构造方法接受被装饰的对象;并基于被装饰的对象的功 能,提供更强的功能。
class Person {
public void chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p;
SuperPerson(Person p){
this.p = p;
}
public void superChifan(){
System.out.println("开胃菜");
p.chifan();
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo{
public static void main(String[] args){
Person p = new Person ();
SuperPerson sp = new SuperPerson(p);
sp.superChifan();
}
}
看到这里,就会有个疑问,为什么不直接继承,干嘛要用装饰设计模式?
举例:MyReader 一个专门用于读取数据的类。它有很多歌子类用于读取不同类型数据,如:MyTextReader,MyMediaReader,MyDataReader等等;
如果用继承的方法进行功能扩展,则需要给每个类写个子类,如果有100个子类,难道还要写100个子类?显然用继承的方法麻烦。
MyReader
|--MyTextReader
|--MyBufferTextReader
|--MyMediaReader
|--MyBufferMediaReader
|--MyDataReader
|--MyBufferDataReader
而用装饰设计模式,写一个MyReader 的子类MyBufferReader,这个子类可以对其它每个子类进行功能扩展
MyReader
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader