装饰者模式
装饰者模式是一种设计巧妙的设计模式,它能够动态的添加对象功能,而对原始对象无干扰。java程序设计中有一个很重要的原则就是尽可能实现复用。逻辑复用只有两种模式,一种是继承,一种是委托。继承模式两者之间是强依赖关系,任何父类的改动都会影响子类,不利于系统的维护。而委托是一种松耦合的状态,只要接口不变,委托类的改变并不会影响调用类。
装饰者模式就充分利用这种思想,通过委托机制,复用系统中的各个组件,在运行时,蒋这些组件进行组装叠加,从而构造一个“超级对象”,使其拥有这些组件的功能。而各个组件相互独立。
被装饰者是系统的核心,完成特定的目标功能。装饰者和被装饰者拥有相同的接口。
1.Componet定义统一接口
2.被装饰者ConcreteComponent实现Component接口,它是组件接口的核心方法。
3.Decorator是实现装饰者的抽象类
4.SubDecorator1和SubDecorator2是真正的装饰者类
示例
类如对输出结果进行增强的场景中。例如需要将某一结果通过HTML进行发布,那么首先就需要将内容转化为HTML文本。同时,由于内容需要在网络上通过HTTP流动,随意还需要加上HTTP头。对应的UML如下
各个类和对接接口代码如下:
package book.performance.part2.decorator;
public interface IPacketCreator {
public String handleContent();
}
package book.performance.part2.decorator;
public class PacketBodyCreator implements IPacketCreator{
public String handleContent() {
return "Content a Packet";
}
}
package book.performance.part2.decorator;
public abstract class PacketDecorator implements IPacketCreator{
IPacketCreator creator = null;
public PacketDecorator(IPacketCreator creator){
this.creator = creator;
}
}
package book.performance.part2.decorator;
public class PacketHTMLHeaderCreator extends PacketDecorator{
public PacketHTMLHeaderCreator(IPacketCreator creator) {
super(creator);
}
public String handleContent() {
StringBuffer bf = new StringBuffer();
bf.append("<html>");
bf.append("<body>");
bf.append(creator.handleContent());
bf.append("</body>");
bf.append("</html>\n");
return bf.toString();
}
}
package book.performance.part2.decorator;
public class PacketHTTPHeaderCreator extends PacketDecorator{
public PacketHTTPHeaderCreator(IPacketCreator creator) {
super(creator);
}
public String handleContent() {
StringBuffer bf = new StringBuffer();
bf.append("Cache-Control:no-cache\n");
bf.append("Date:Mon,31Dec202304:25:55GMT\n");
bf.append(creator.handleContent());
return bf.toString();
}
}
package book.performance.part2.decorator;
public class MainClass {
public static void main(String args[]){
IPacketCreator creator = new PacketHTTPHeaderCreator(new PacketHTMLHeaderCreator(new PacketBodyCreator()));
System.out.println(creator.handleContent());
}
}
执行结果: