装饰者主要概述:
装饰者模式利用合成/聚合复用原则,使用委托机制,复用系统中的各个组件,在运行时,可以将这些组件进行叠加,从而构造出一个“超级对象”,使其拥有这些组件的所有功能。
装饰者模式的主要角色:
组件接口:组件接口是装饰者和被装饰者的超类或组件,它定义了装饰者的核心功能和被装饰者需要加强的功能。
具体组件:具体组件实现了核心功能,完成业务逻辑,他是被装饰对象。
装饰者:实现组件接口,并持有被装饰者对象。
具体装饰者:实现了完整的核心业务逻辑,组件相互叠加,形成一个功能强大的组件对象。
举例说明:
需要一个结果通过HTML发布,现在需要转换一个HTML文本,由于需要在网络上传输,所以需要一个HTTP头部,还要有TCP头部,实际内容三部分。实际内容为核心部分,两个头部为装饰部分。
具体代码实现:
//组件接口类
public interface IPacketCreator{
public String handleContent();
}
//PacketBodyCreator用于返回数据包核心数据
public calss PacketBodyCreator implements IPacketCreator{
public String handleContent(){
return "Content of Packet";
}
}
//管理装饰者
public abstract calss PacketDecorator implements IPacketCreator{
IPacketCreator component;
public PacketDecorator(IPacketCreator c){
component = c;
}
}
//增加HTML格式化装饰者
public calss PacketHTMLHeaderCreator extends PacketDecorator{
public PacketHTMLHeaderCreator(IPacketCreator c){
super(c);
}
public String handleContent(){
StringBuffer sb = new StringBuffer();
sb.append("<html>");
sb.append("<body>");
sb.append(component.handleContent()); //把核心数据放入
sb.append("</body>");
sb.append("</html>");
return sb.toString();
}
}
//增加HTTP头部装饰者
public class PacketHTTPHeaderCreator extends PacketDecorator{
public PacketHTTPHeaderCreator(IPacketCreator c){
super(c);
}
public String handleContent(){
StringBuffer sb = new StringBuffer();
sb.append("Cache-Control:no-cache\n");
sb.append("Date:mon,31Dec201225:25:57GMT\n");
sb.append(component.handleContent());
return sb.toString();
}
}
//主函数
public static void main(String[] args) {
IPacketCreator pc = new PacketHTTPHeaderCreator
(new PacketHTMLHeaderCreator(new PacketBodyCreator()));
System.out.printlm(pc.handleContent());
}
//系统输出如下
Cache-Control:no-cache
Date:mon,31Dec201225:25:57GMT
<html><body>Content of Packet</body></html>
在JDK中的OutputStream和InputStream类族都是装饰者模式实现的,OutputStream对象提供的方法比较简单,功能也比较弱,通过装饰者模式可以使其增强,比如加入缓冲组件,在去磁盘写入数据时,将数据先写入缓存中,当缓存满了,再实际写入数据。