• 装饰模式


      大家好,我叫小赵,现任职藏剑山庄高级铸剑师,今天抽空跟大家唠唠嗑,希望能赚几个点击,赚几个关注。

      我们山庄每天都会出很多货,每把武器打造出来之后,会进行包装,因为大众化的口味总是需要各种各样的点缀,因此负责包装的部门也根据包装装饰品的不同分为不同的小组。

      咱们从最简单的开始,就打包就行,不用搞装饰。

    类图:

    剑:

    public abstract class Sword {
        //打包
        public abstract void pack();
        //展示
        public abstract void show();
    }

    倚天剑:

    public class YitianSword extends Sword {
        @Override
        public void pack() {
            System.out.println("开始包装...");
        }
    
        @Override
        public void show() {
            System.out.println("这是一把倚天剑!");
        }
    }

    主函数:

        public static void main(String[] args){
            Sword yitian = new YitianSword();
            yitian.pack();
            yitian.show();
        }

    输出:

    开始包装...
    这是一把倚天剑!

      接下来我们就要对倚天剑进行各式各样装饰,给倚天剑加个剑穗,再加个激光刻字,其实加什么都是小事,重要的是,要遵守开闭原则,对修改关闭,对扩展开放,在不修改原来代码的前提下完成新功能的增加,做到真正的拥抱变化。

    类图:

    装饰器抽象:

    public abstract class Decorator extends Sword {
        //要装饰的目标
        private Sword sword;
    
        public Decorator(Sword sword) {
            this.sword = sword;
        }
    
        @Override
        public void pack() {
            this.sword.pack();
        }
    
        @Override
        public void show() {
            this.sword.show();
        }
    }

    装饰剑穗:

    public class EarDecorator extends Decorator {
        public EarDecorator(Sword sword) {
            super(sword);
        }
    
        private void ear(){
            System.out.println("装剑穗...");
        }
    
        @Override
        public void pack() {
            super.pack();
            this.ear();
        }
    }

    装饰激光刻字:

    public class LetteringDecorator extends Decorator {
        public LetteringDecorator(Sword sword) {
            super(sword);
        }
    
        private void sheath(){
            System.out.println("激光刻字...");
        }
    
        @Override
        public void pack() {
            super.pack();
            this.sheath();
        }
    }

    主函数:

        public static void main(String[] args) {
            Sword yitianSword = new YitianSword();
            yitianSword = new LetteringDecorator(yitianSword);//装饰激光刻字
            yitianSword = new EarDecorator(yitianSword);//装饰剑穗
            yitianSword.pack();//开始装饰
            yitianSword.show();
        }

    输出:

    开始包装...
    激光刻字...
    装剑穗...
    这是一把倚天剑!

      这就是使用装饰模式进行的倚天剑包装,倚天剑的制造团队并不需要知道倚天剑的装饰品都有哪些,装饰类和被装饰类都可以独立发展,双方不会耦合。

      当需要给一个对象动态的附加功能的时候,比如有一批倚天剑需要激光刻字,有一批倚天剑不需要激光刻字,遇到这种场景,优先考虑装饰模式。

  • 相关阅读:
    C# 二维码 ThoughtWorks.QRCode.dll
    Asp.net生命周期
    进程和线程,多线程等使用方法
    反射的使用与定义
    《委托和事件》
    《泛型集合》
    第三课时《枚举》
    数据库字段包括数组中的每一项
    .NetCore 图片压缩
    NetCore3.0 EF修改
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/10767153.html
Copyright © 2020-2023  润新知