设计模式之装饰者模式

装饰者模式

装饰者模式是一种设计巧妙的设计模式,它能够动态的添加对象功能,而对原始对象无干扰。java程序设计中有一个很重要的原则就是尽可能实现复用。逻辑复用只有两种模式,一种是继承,一种是委托。继承模式两者之间是强依赖关系,任何父类的改动都会影响子类,不利于系统的维护。而委托是一种松耦合的状态,只要接口不变,委托类的改变并不会影响调用类。
装饰者模式就充分利用这种思想,通过委托机制,复用系统中的各个组件,在运行时,蒋这些组件进行组装叠加,从而构造一个“超级对象”,使其拥有这些组件的功能。而各个组件相互独立。
被装饰者是系统的核心,完成特定的目标功能。装饰者和被装饰者拥有相同的接口。
设计模式之装饰者模式_第1张图片

1.Componet定义统一接口
2.被装饰者ConcreteComponent实现Component接口,它是组件接口的核心方法。
3.Decorator是实现装饰者的抽象类
4.SubDecorator1和SubDecorator2是真正的装饰者类

示例

类如对输出结果进行增强的场景中。例如需要将某一结果通过HTML进行发布,那么首先就需要将内容转化为HTML文本。同时,由于内容需要在网络上通过HTTP流动,随意还需要加上HTTP头。对应的UML如下
设计模式之装饰者模式_第2张图片
各个类和对接接口代码如下:

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("");
        bf.append("");
        bf.append(creator.handleContent());
        bf.append("");
        bf.append("\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());
    }
}

执行结果:
设计模式之装饰者模式_第3张图片

你可能感兴趣的:(设计模式,java,设计模式)