decorator装饰器模式,动态地扩展一个对象的功能,而不需要改变原始的类代码或使用继承。是通过创建一个跟目的类同一等级(继承目的类的父类)的称为装饰器的封装对象来实现的。要新添加的功能类继承这个装饰器,这样用户类可以像使用原来的类那样使用新添加的功能类。
decorator装饰器模式可以动态地添加功能,也可以动态地撤销功能。如果一个父类的n个子类,都需要有一个或若干个功能,而它们操作该功能的代码结构基本一致,这个时候就可以考虑使用decorator装饰器模式。如使用继承来实现的话,父类的n个子类的都要派生出子类并实现这些功能,随着子类的增加,重复的代码量会不断增加,灵活性较差。并且利用decorator装饰器模式易于添加任何功能的组合,同一个功能甚至可以添加两次,而继承难以做到这一点。
java中对流的操作,需要叠合多个对象,其实就是应用了装饰器模式。
例如,需要对不同类型的信息进行不同的储存方式,而不同信息的来源不同,这时可以考虑decorator装饰器模式。
public interface Info{
public void read(String path);
public void save();
}
public class FileInfo implements Info{
protect String str;
public void read(String path){/*...*/}
public void save(){/*...*/}
}
public class NetInfo implements Info{
protect String str;
public void read(String path){/*...*/}
public void save(){/*...*/}
}
public class Decorator impletments Info{
Info info;
protect String str;
public Decorator(Info info){this.info=info;}
public void read(String path){info.read(path);}
public void save(){info.save();}
}
public class HtmlDocument extends Decorator{
public HtmlDocument(Info info){super(info);}
public void save(){html();info.save();}
public void html(){/*对str进行处理...*/}
}
public class EncrypDocument extends Decorator{
public EncrypDocument(Info info){super(info);}
public void save(){encryp();info.save();}
public void encryp(){/*对str进行处理...*/}
}
public class Main{
public static void main(String args[]){
Info info = new NetInfo();
Decorator d = new XmlDocument(info);
d.read();
d.save();
}
}