• Java设计模式从精通到入门二 装饰器模式


    介绍

    ​ 我尽量用最少的语言解释总结:

    ​ Java23种设计模式之一,属于结构型模式,允许向一个现有的对象添加新的功能,不改变其结构。

    应用实例:

    ​ 给英雄联盟种的射手,添加不同的装备。先装备攻速鞋,在装备电刀,最后装备无尽

    uml类图如下

    主要代码如下

    ADC类:

    
    /**
     * @ClassName ADC
     * @Description 英雄联盟射手
     * @Author ouyangkang
     * @Date 2018-11-13 08:49
     **/
    public interface ADC {
    
        /**
         * @Author ouyangkang
         * @Description ADC 必备好吧 攻击 和赢得胜利
         * @Date 8:50 2018/11/13
         * @param
         * @return void
        **/
        void attack();
    
        /**
         * @Author ouyangkang
         * @Description 补刀是一个射手必备的素质
         * @Date 8:51 2018/11/13
         * @param 
         * @return void
        **/
        void repairKnives();
    }
    

    VN这个射手类

    /**
     * @ClassName VN
     * @Description 薇恩 em... 最喜欢的射手之一
     * @Author ouyangkang
     * @Date 2018-11-13 08:53
     **/
    public class VN implements ADC {
    
        @Override
        public void attack() {
            System.out.println("vn 发起了攻击。。。");
        }
    
        @Override
        public void repairKnives() {
            System.out.println("vn 开始补刀。。。");
        }
    }
    

    ADC 装备抽象类

    
    /**
     * @ClassName DecorateEquipment
     * @Description ADC 的装备 抽象类  也就是抽象装饰
     *
     * 要实现这个射手的接口,并持有改接口的引用
     * @Author ouyangkang
     * @Date 2018-11-13 08:56
     **/
    public abstract class DecorateEquipment implements ADC{
    
        private ADC adc;
    
        public DecorateEquipment(ADC adc){
            this.adc = adc;
        }
    
        @Override
        public void repairKnives(){
            this.adc.repairKnives();
        }
    
        @Override
        public void attack(){
            this.adc.attack();
        }
    
    }
    

    功速鞋类

    
    /**
     * @ClassName SpeedShoe
     * @Description 攻速鞋 这件装备
     * @Author ouyangkang
     * @Date 2018-11-13 09:08
     **/
    public class SpeedShoe extends DecorateEquipment {
        public SpeedShoe(ADC adc) {
            super(adc);
        }
    
    
    
        @Override
        public void repairKnives() {
            // 装备着攻速鞋进行补刀
            equipment();
            super.repairKnives();
        }
    
        @Override
        public void attack() {
            // 装备着攻速鞋进行团战 杀人
            equipment();
            super.attack();
        }
    
        /**
         * @Author ouyangkang
         * @Description 装备
         * @Date 9:03 2018/11/13
         * @param
         * @return void
         **/
        private void equipment(){
            System.out.println("装备攻速鞋 提升攻速");
        }
    }
    

    电刀类

    
    /**
     * @ClassName ElectricKnife
     * @Description 电刀这件装备
     * @Author ouyangkang
     * @Date 2018-11-13 09:02
     **/
    public class ElectricKnife extends DecorateEquipment {
    
        public ElectricKnife(ADC adc) {
            super(adc);
        }
    
    
        @Override
        public void repairKnives() {
            // 装备着电刀进行补刀
            equipment();
            super.repairKnives();
        }
    
        @Override
        public void attack() {
            // 装备着电刀进行团战 杀人
            equipment();
            super.attack();
        }
    
        /**
         * @Author ouyangkang
         * @Description 装备
         * @Date 9:03 2018/11/13
         * @param 
         * @return void
        **/
        private void equipment(){
            System.out.println("装备电刀这件武器。。。");
        }
    
    }
    

    无尽类

    
    /**
     * @ClassName EndLess
     * @Description 无尽 这件装备
     * @Author ouyangkang
     * @Date 2018-11-13 09:22
     **/
    public class EndLess extends DecorateEquipment {
    
        public EndLess(ADC adc) {
            super(adc);
        }
    
        @Override
        public void repairKnives() {
            equipment();
            super.repairKnives();
        }
    
        @Override
        public void attack() {
            equipment();
            super.attack();
        }
    
        private void equipment(){
            System.out.println("装备着无尽 提高暴击和攻击力");
        }
    }
    

    测试类

    
    /**
     * @ClassName main
     * @Description 创建一个射手 向下传递
     * @Author ouyangkang
     * @Date 2018-11-13 09:10
     **/
    public class main {
    
        public static void main(String[] args) {
            // 创建一个射手
            ADC vn = new VN();
    
            // 第三 装无尽
            vn = new EndLess(vn);
    
            // 第二 装电刀
            vn = new ElectricKnife(vn);
    
            // 第一 装攻速鞋
            vn = new SpeedShoe(vn);
            vn.repairKnives();
            System.out.println("-----------------------------");
            vn.attack();
    
    
        }
    }
    

    测试结果如下:

    装备攻速鞋 提升攻速
    装备电刀这件武器。。。
    装备着无尽 提高暴击和攻击力
    vn 开始补刀。。。
    -----------------------------
    装备攻速鞋 提升攻速
    装备电刀这件武器。。。
    装备着无尽 提高暴击和攻击力
    vn 发起了攻击。。。
    

    总结

    ​ 注意装饰抽象类需要实现你需要进行装备的对象。并持有改对象的引用。然后测试类种的对象都是向上传递。

  • 相关阅读:
    关于运行SWT程序遇到的一个错误的总结
    Window7英文系统中出现的中文乱码的更改设置
    关于SWT中的表格(TableViewer类)
    关于SWT的容器类之----面板Composite类和Group类
    关于SWT中的Combo类和List类
    js怎么获取图片的相对地址
    .NET/MVC-ViewBag、ViewData、TempData区别
    Razor语法(五)
    Razor语法(四)
    Razor语法(三)
  • 原文地址:https://www.cnblogs.com/Krloypower/p/9950650.html
Copyright © 2020-2023  润新知