美文网首页程序员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