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

装饰器模式(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());
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。