美文网首页
装饰器模式

装饰器模式

作者: zzj0990 | 来源:发表于2021-01-17 11:54 被阅读0次

1. 概念

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活

划重点--装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能够扩展对象的新功能。使用对象的组合关系(区分于“组合设计模式”)代替继承关系,避免类型体系的快速膨胀。*

简单地说,装饰模式用于动态增加一个对象的新功能,或称为功能增强。

2. 使用场景

需要扩展一个类的功能,或给一个类增加附加功能。
需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式

3. 装饰器角色

屏幕快照 2021-01-17 上午11.39.53.png
  • 角色:
    Component抽象构件:是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。
    ConcreteComponent具体构件:最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
    Decorator装饰角色:在它的属性里必然有一个private变量指向Component抽象构件。
  • 示例
    // 抽象构件
    public abstract class Component {
         // 抽象的方法
         public abstract void operate();
    }
    // 具体构件
    public class ConcreteComponent extends Component {
         // 具体实现
         @Override
         public void operate() {
                 System.out.println("do Something");
         }
    }
    // 装饰者
    public class Decorator extends Component {
         private Component component = null;
         // 通过构造函数传递被修饰者
         public Decorator(Component _component){
                 this.component = _component;
         }
         //定义自己的修饰方法
         private void method1(){
                 System.out.println("method1 修饰");
         }
         // 委托给被修饰者执行
         @Override
         public void operate() {
                 this.method1();
                 this.component.operate();
         }
    }
    // 场景类
    public class Client {
         public static void main(String[] args) {
                 Component component = new ConcreteComponent();
                 // 修饰
                 component = new Decorator(component);
                 // 多次修饰
                 component = new Decorator2(component);
                 //修饰后运行
                 component.operate();
         }
    }

4. 总结

  • 优点
  1. 装饰类和被装饰类可以独立发展,而不会相互耦合
  2. 装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不管装饰多少层,返回的对象还是Component
  • 缺点
  1. 多层的装饰是比较复杂的,尽量减少装饰类的数量,以便降低系统的复杂度

————————————————————
坐标帝都,白天上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注

相关文章

网友评论

      本文标题:装饰器模式

      本文链接:https://www.haomeiwen.com/subject/yitmaktx.html