一、基本概念
装饰者模式是指在不改变元有对象的基础之上,将功能附加对象上,提供了比集成更有弹性的替代方案(扩展原有对象功能),属于结构型模式。
适用场景:
1、用于扩展一个类的功能或者给一个类增加职责。
2、动态的给一个对象添加功能,这些功能也可以动态的撤销掉。
二、生活实例
煎饼果子加火腿加鸡蛋还是煎饼果子。
三、代码实例
/**
* @description:煎饼果子基础套餐
* @author: annecheng,2019-06-30 19:04
*/
public class BaseBatterCake extends Battercake {
protected String getMsg() {
return "煎饼";
}
protected int getPrice() {
return 5;
}
}
/**
* @description:煎饼果子抽象类
* @author: annecheng,2019-06-30 18:56
*/
public abstract class Battercake {
protected abstract String getMsg();
protected abstract int getPrice();
}
/**
* @description:包装抽象类
* @author: annecheng,2019-06-30 19:06
*/
public abstract class BatterCakeDecorator extends Battercake{
private Battercake battercake;
public BatterCakeDecorator(Battercake battercake) {
this.battercake = battercake;
}
@Override
protected String getMsg() {
return this.battercake.getMsg();
}
@Override
protected int getPrice() {
return this.battercake.getPrice();
}
}
/**
* @description:鸡蛋装饰器
* @author: annecheng,2019-06-30 19:09
*/
public class EggDecorator extends BatterCakeDecorator{
public EggDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected String getMsg() {
return super.getMsg() + "+1个鸡蛋";
}
@Override
protected int getPrice() {
return super.getPrice() + 1;
}
}
/**
* @description:香肠装饰器
* @author: annecheng,2019-06-30 19:09
*/
public class SausageDecorator extends BatterCakeDecorator {
public SausageDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected String getMsg() {
return super.getMsg() + "+1根香肠";
}
@Override
protected int getPrice() {
return super.getPrice() + 2;
}
}
类图:
测试:
四、经典案例
org.apache.ibatis.cache 和 TransactionAwareCacheDecorator
五、总结
优点:
1、装饰者是继承的有力补充,比继承更加灵活,不改变原有对象的情况下动态地给对象扩展功能,即加即用;
2、通过使用不同装饰类以及这些装饰类地排列组合,可以实现不同效果。
3、完全遵守开闭原则。
缺点:
1、会出现更多地代码,增加了程序地复杂性。
2、动态装饰时,多层装饰会更复杂。