装饰模式

Posted endian11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰模式相关的知识,希望对你有一定的参考价值。

  • 定义:动态地给一个对象添加一些额外的功能,就增加功能来说,装饰模式比生成

 

  • 装饰模式的简单实现:
    • 抽象组件
      public interface SwordMan {
          void attackMagic();
      }
      

        

    • 抽象组件具体实现类
      public class Yanguo implements SwordMan {
      
          @Override
          public void attackMagic() {
              System.out.println("杨过使用全真剑法");
          }
      }
      

        

    • 抽象装饰者
      public abstract class Master implements SwordMan {
          SwordMan swordMan;
          @Override
          public void attackMagic() {
      
              swordMan.attackMagic();
          }
      
          public Master(SwordMan swordMan) {
              this.swordMan = swordMan;
          }
      
      }
      

        

    • 装饰者具体类
      public class HongQiGong extends Master {
          public HongQiGong(SwordMan swordMan) {
              super(swordMan);
          }
      
          @Override
          public void attackMagic() {
              super.attackMagic();
              techAttackMagic();
          }
      
          private void techAttackMagic() {
              System.out.println("洪七公教授打狗棒法");
              System.out.println("杨过学会打狗棒法");
          }
      }
      

        

    • 客户端调用
      public class ClientDecorator {
          public static void main(String[] rags){
              SwordMan swordMan = new Yanguo();
              HongQiGong hongQiGong = new HongQiGong(swordMan);
      
              hongQiGong.attackMagic();
          }
      }
      

        

  • 应用场景
    • 在不影响其他对象使用的情况下,以动态、透明的方式给单个对象添加职责
    • 需要动态地给一个对象增加功能,这些功能可以动态地撤销
    • 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时
  • 优点
    • 装饰类和被装饰类可以独立发展,不互相耦合,装饰模式是继承的一个替代模式,可以动态扩展一个实现类的功能
    • 通过组合而非继承的方式,动态扩展一个对象的功能,在运行时选择不同的装饰器,从而实现不同的行为
    • 有效避免了使用继承的方式扩展对象功能而带来的灵活性差、子类无限扩张的问题
  • 缺点
    • 因为所有对象均继承与Compnent,所以如果Compnent内部结构发生改变,则不可避免地影响所有子类(装饰者和被装饰者),如果基类改变,则势必影响对象的内部
    • 比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加容易出错,排错也很困难。对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐。所以只有在必要的时候使用装饰模式
    • 装饰层数不能过多,否则会影响效率

以上是关于装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 模板 - 有没有办法装饰模板而不是包含模板片段?

swift设计模式学习 - 装饰模式代码大全

设计模式---装饰者模式

设计模式之单例模式

装饰模式与代理模式的区别

Java设计模式之装饰者模式