设计模式之 装饰器模式

装饰器模式是为已有功能动态的添加更多功能的一种方式。
  • 优点:

    有效的把类的核心职责和装饰功能区分开,职责更细化

  • UML

    image.png
  • code

    public interface Apple {
    
        /**
         * 描述
         */
        void res();
    }
    
    public class ConcreteApple implements Apple {
        @Override
        public void res() {
            System.out.println("普通的苹果");
        }
    }
    
    • 装饰器基类

      public abstract class Decorator implements Apple {
      
          protected Apple apple;
      
          public Decorator(Apple apple) {
              super();
              this.apple = apple;
          }
          @Override
          public void res() {
              apple.res();
          }
          
      }
      
      public class ConcreteDecoratorA extends Decorator{
      
          public ConcreteDecoratorA(Apple apple) {
              super(apple);
          }
          
          public void resA(){
              System.out.println("被装饰器A扩展的功能");
          }
      
          @Override
          public void res(){
              System.out.println("装饰器A=>装饰成红色的");
              super.res();
              System.out.println("装饰器A=>装饰结束");
          }
      }
      
      public class ConcreteDecoratorB extends Decorator{
      
          public ConcreteDecoratorB(Apple apple) {
              super(apple);
          }
          
          public void resB(){
              System.out.println("被装饰器B扩展的功能");
          }
      
          @Override
          public void res(){
              System.out.println("装饰器B=>装饰成绿色的");
              super.res();
              System.out.println("装饰器B=>装饰结束");
          }
      }
      
      • 测试

        **
         * @author tanoak@qq.com
         * @date 2018/7/26 14:08
         * @Desc 装饰器模式
         *   1,不改变原类文件。
         *   2,不使用继承。
         *   3,动态扩展。
         */
        public class Main {
        
          public static void main(String[] args) {
              Apple apple =new ConcreteApple();
              System.out.println("-----------未装饰-------------------\n");
              apple.res();//原来的方法
              System.out.println("------------------------------------\n");
              test2(apple) ;
          }
          private static void test2(Apple apple){
              ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple);
              System.out.println("\n-----------装饰后-------------------\n");
                decoratorB.res();
              System.out.println("------------------------------");
          }
        }
           
        

        总结

        • 使用场景

          当系统需要增加新功能时,向旧的类中添加新的代码,装饰原有类的核心职责或主要行为
          eg:
          在上述代码中
           我想要对苹果的颜色进行包装,但是也会存在不进行包装的情况,核心逻辑是苹果,其次是对苹果进行装饰
          
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容