设计模式之装饰器模式

装饰器模式

Java 的 IO 中就使用了装饰器模式进行设计。

职责
  • 动态的为一个对象增加新的功能

  • 装饰模式是一种用于代替继承的技术。无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

实现细节

装饰者和被装饰者拥有相同的接口。

角色作用
组件接口是装饰者和被装饰者的父类或者是接口。定义了被装饰者的核心功能和装饰者需要加强的功能点
具体组件实现了组件接口的核心方法,完成某个具体的业务逻辑。也是被装饰的对象
装饰者实现组件接口,并持有一个具体的被装饰者对象
具体装饰者具体实现装饰的业务逻辑,及实现了被分离的各个增强功能点。各个具体的装饰者是可以相互叠加的,从而可以构成一个功能更加强大的对象

案例:对输出接口增强
例如 HTML 页面的发布,需要对其加 header、甚至是 TCP 头等。

实现如下:
组件接口

/**
 * @desc 组件接口
 * @date 2019年10月27日
 */
public interface IPackageCreator {
    public String handleContent();
}

被装饰者

/**
 * @desc 被装饰者
 * @date 2019年10月27日
 */
public class PackageBodyCreator implements IPackageCreator {

    @Override
    public String handleContent() {
        return "Hello World!";
    }

}

装饰器组件

/**
 * @desc 装饰者核心组件: 告诉子类自己只是其增强作用,核心业务由 component 实现
 * @date 2019年10月27日
 */
public abstract class PackageDecorator implements IPackageCreator {

    IPackageCreator component;

    public PackageDecorator(IPackageCreator component) {
        this.component = component;
    }

}

具体的装饰器

/**
 * @desc 具体的装饰器,给content 添加 html 标签
 * @date 2019年10月27日
 */
public class PacketHTMLHeaderCreator extends PackageDecorator {

    public PacketHTMLHeaderCreator(IPackageCreator component) {
        super(component);
    }

    @Override
    public String handleContent() {
        StringBuilder sb = new StringBuilder();
        sb.append("<html>");
        sb.append("<body>");
        sb.append(component.handleContent());
        sb.append("</body>");
        sb.append("</html>\n");
        return sb.toString();
    }

}

/**
 * @desc 具体的装饰器,给content 添加 Http Header
 * @date 2019年10月27日
 */
public class PacketHTTPHeaderCreator extends PackageDecorator {

    public PacketHTTPHeaderCreator(IPackageCreator component) {
        super(component);
    }

    @Override
    public String handleContent() {
        StringBuilder sb = new StringBuilder();
        sb.append("Cache-Control: no-cache\n");
        sb.append(component.handleContent());
        return sb.toString();
    }

}

Main

public class Main {

    public static void main(String[] args) {
        IPackageCreator creator = new PacketHTTPHeaderCreator(new PacketHTMLHeaderCreator(new PackageBodyCreator()));
        System.out.println(creator.handleContent());
    }
}
----------------------------------------
Cache-Control: no-cache
<html><body>Hello World!</body></html>


总结
  • 装饰器模式也叫包装器模式

  • 装饰器模式降低系统的耦合度,可以动态的增加和删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类

优点
  • 扩展对象功能,比继承灵活,不会导致类个数的急剧增加

  • 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象

  • 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构建子类和具体装饰子类

缺点
  • 产生大量的小对象。大量对象占用内存,影响性能

  • 易出错,调试麻烦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值