美文网首页程序员Java设计模式
设计模式-装饰器模式-Decorator

设计模式-装饰器模式-Decorator

作者: AdminFun | 来源:发表于2019-01-14 10:11 被阅读2次

    装饰器模式(Decorator),也叫包装模式,在不改变超类逻辑和功能的情况下,对超类增加功能行为,以此替代继承方案。

    一、使用场景

    如果想要给一个具体类增加功能行为,通常的方法有:继承超类再修改。但继承模式有2个天生的缺陷:破坏封装性 和 超强的耦合度,所以一个解决此问题的模式应运而生:装饰器模式。

    二、3个元素

    1、抽象接口:用于规范被装饰的对象的内部逻辑;
    2、抽象实现:被装饰的对象,是一个实现了抽象接口的具体对象;
    3、装 饰 器:持有抽象接口,并实现抽象接口,在实现方法内调用抽象接口方法,达到包装目的。

    三、示例代码

    1、抽象接口
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 描述: 这是一个长安汽车抽象类,用[abstract]抽象类也可实现!
     */
    public interface ICar {
    
        /**
         * 汽车的价格
         */
        double getPrice();
    
        /**
         * 汽车的型号
         */
        String getModel();
    }
    
    2、抽象实现
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     * 描述: 长安CS85,被装饰/包装的对象
     */
    public class CS85Info implements ICar {
    
        @Override
        public double getPrice() {
            return 150000;
        }
    
        @Override
        public String getModel() {
            return "长安CS85";
        }
    }
    
    3、装饰器
    /**
     * 作者: Created by AdminFun
     * 邮箱: 614484070@qq.com
     * 创建: 2019/1/4
     * 修改: 2019/1/4
     * 版本: v1.0.0
     * 描述: 汽车装饰器,这里是对汽车进行装饰的。
     * 1、不需要关注具体的汽车型号,只要有汽车就可以进行这些装饰
     * 2、不改变汽车的原结构,只增加新的功能行为
     * 注意:这里只是写了一个示例,装饰逻辑可以在构造中,也可以在方法中,具体取决于需求。
     */
    public class DecoratorTail implements ICar {
    
        private ICar mCar;
    
        public DecoratorTail(ICar iCar) {
            mCar = iCar;
            addTail();
        }
    
        private void addTail() {
            // 给mCar加装尾翼
            Log.d("common", "正在安装尾翼!");
        }
    
        @Override
        public double getPrice() {
            return mCar.getPrice();
        }
    
        @Override
        public String getModel() {
            return mCar.getModel();
        }
    }
    
    4、使用
    public static void main() {
            CS85Info cs85Info = new CS85Info();
            DecoratorTail decoratorTail = new DecoratorTail(cs85Info);
            Log.d("common", decoratorTail.getModel());
        }
    

    相关文章

      网友评论

        本文标题:设计模式-装饰器模式-Decorator

        本文链接:https://www.haomeiwen.com/subject/rofddqtx.html