设计模式之装饰者模式

装饰者模式

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

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

示例

类如对输出结果进行增强的场景中。例如需要将某一结果通过HTML进行发布,那么首先就需要将内容转化为HTML文本。同时,由于内容需要在网络上通过HTTP流动,随意还需要加上HTTP头。对应的UML如下
输出结果文本增加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());
    }
}

执行结果:
执行结果

相关推荐

  1. 设计模式装饰模式

    2024-01-13 10:28:04       38 阅读
  2. 设计模式装饰模式

    2024-01-13 10:28:04       37 阅读
  3. 装饰模式设计模式

    2024-01-13 10:28:04       3 阅读
  4. 装饰设计模式总结

    2024-01-13 10:28:04       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-13 10:28:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-13 10:28:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-13 10:28:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-13 10:28:04       18 阅读

热门阅读

  1. LocalDateTime与时间戳转换的全局配置

    2024-01-13 10:28:04       36 阅读
  2. golang学习-结构体

    2024-01-13 10:28:04       28 阅读
  3. No Feign Client for loadBalancing defined. 错误解决

    2024-01-13 10:28:04       36 阅读
  4. MYSQL学习——聚合函数

    2024-01-13 10:28:04       28 阅读
  5. 30天精通Nodejs--第十五天:Websocket

    2024-01-13 10:28:04       34 阅读
  6. 深度学习基础教程

    2024-01-13 10:28:04       28 阅读
  7. 「HDLBits题解」Module add

    2024-01-13 10:28:04       29 阅读
  8. 在Python中调用狄拉克gamma矩阵

    2024-01-13 10:28:04       29 阅读
  9. leaflet聚类——leaflet.markercluster

    2024-01-13 10:28:04       28 阅读
  10. 单链表与循环链表创建

    2024-01-13 10:28:04       37 阅读
  11. 关于人工智能的浅见

    2024-01-13 10:28:04       34 阅读