定义
装饰者模式通过委托的方式,将对象的功能叠加,从而增强原有对象功能。
角色
角色 | 作用 |
---|---|
组件接口 | 是装饰者或者被装饰者的超类或者接口,定义了被装饰者的核心功能和修饰者需要加强的方法 |
具体组件 | 实现了组件接口的核心方法,完成业务逻辑,是被装饰的对象 |
装饰者 | 实现组件接口,并持有具体的被装饰者对象 |
具体装饰者 | 具体实现装饰的业务逻辑,各个具体装饰者是可以叠加的 |
类图
应用
假设要将某结果以HTML进行发布,那么首先需要将内容转化为HTML文本。同时,内容要通过HTTP传输,还需要为其添加HTTP头。
代码
/**
* 装饰接口
* @author wzx
* @time 2018/5/27
*/
public interface IPacketCreator {
String handlerContent();
}
/**
* 具体组件
* @author wzx
* @time 2018/5/27
*/
public class PackeyBodyCreator implements IPacketCreator {
@Override
public String handlerContent() {
return "Content of Packet";
}
}
/**
* 装饰者
* @author wzx
* @time 2018/5/27
*/
public abstract class PacketDecorator implements IPacketCreator {
IPacketCreator packetCreator;
public PacketDecorator(IPacketCreator packetCreator) {
this.packetCreator = packetCreator;
}
}
/**
* @author wzx
* @time 2018/5/27
*/
public class PacketHTMLHeaderCreator extends PacketDecorator {
public PacketHTMLHeaderCreator(IPacketCreator packetCreator) {
super(packetCreator);
}
@Override
public String handlerContent() {
String sb = "<html>" +
"<body>" +
packetCreator.handlerContent() +
"</body>" +
"</html>";
return sb;
}
}
/**
* @author wzx
* @time 2018/5/27
*/
public class PacketHTTPHeaderCreator extends PacketDecorator{
public PacketHTTPHeaderCreator(IPacketCreator packetCreator) {
super(packetCreator);
}
@Override
public String handlerContent() {
StringBuilder sb = new StringBuilder();
sb.append("Cache-Control:no-cache");
sb.append(packetCreator.handlerContent());
return sb.toString();
}
}
public class Main {
public static void main(String[] args) {
PacketHTTPHeaderCreator creator = new PacketHTTPHeaderCreator(new PacketHTMLHeaderCreator(
new PackeyBodyCreator()
));
System.out.println(creator.handlerContent());
}
}
输出结果
Cache-Control:no-cache<html><body>Content of Packet</body></html>