设计模式之装饰者模式

本文详细介绍了装饰者模式,一种在Java中通过接口实现功能动态添加的策略,避免了继承带来的强依赖,强调了被装饰者和装饰者之间的接口统一。通过实例展示了如何使用装饰者模式处理如内容增强和网络请求头添加等场景。
摘要由CSDN通过智能技术生成

装饰者模式

装饰者模式是一种设计巧妙的设计模式,它能够动态的添加对象功能,而对原始对象无干扰。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());
    }
}

执行结果:
执行结果

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值