• 装饰模式


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

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

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

    类图:

    剑:

    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();
        }

    输出:

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

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

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

  • 相关阅读:
    第一个ExtJS练习(添加用户面板)
    利用高德地图通过给定坐标点画带箭头方向的路径
    安装myeclipse2015 stable 3.0破解之后发生出现SECURITY ALERT:iNTEGRITY CHECK ERROR然后闪退解决方案
    当你的SSM项目中的springmvc.xml发生第一行错误解决方案
    新建maven项目遇到Select an Archetype时没有maven-archetype-webapp处理方法
    XML、HTML、JSON对比
    Mac配置apache2.4.25服务器
    使用HTTP协议访问网络
    android数据持久化存储
    常用git命令
  • 原文地址:https://www.cnblogs.com/fengyumeng/p/10767153.html
Copyright © 2020-2023  润新知