装饰器模式(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());
}
网友评论