内容都是从Tom老师的书中摘抄,记录下来方便自己学习。
装饰者模式(Decrator Pattern) 是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的方案(扩展原有对象的功能),属于结构型模式。适用一下场景:
- 扩展一个类的功能或给一个类添加附加职责;
- 动态给一个对象添加功能,这些功能可以在动态地撤销。
public abstract class Battercake {
protected abstract String getMsg();
protected abstract int getPrice();
}
public class BaseBattercake extends Battercake {
@Override
protected String getMsg() {
return "煎饼";
}
@Override
protected int getPrice() {
return 5;
}
}
public abstract class BattercakeDecorator extends Battercake {
//静态代理、委派
private Battercake battercake;
public BattercakeDecorator(Battercake battercake) {
this.battercake = battercake;
}
protected abstract void doSomething();
@Override
protected String getMsg() {
return this.battercake.getMsg();
}
@Override
protected int getPrice() {
return this.battercake.getPrice();
}
}
public class EggDecorator extends BattercakeDecorator {
public EggDecorator(Battercake battercake) {
super(battercake);
}
protected void doSomething() {
}
@Override
protected String getMsg(){
return super.getMsg()+"1个鸡蛋";
}
@Override
protected int getPrice(){
return super.getPrice()+1;
}
}
public class SausageDecorator extends BattercakeDecorator{
public SausageDecorator(Battercake battercake) {
super(battercake);
}
protected void doSomething() {}
@Override
protected String getMsg(){
return super.getMsg()+"1根香肠";
}
@Override
protected int getPrice(){
return super.getPrice()+2;
}
}
public class BattercakeTest {
public static void main(String[] args) {
Battercake battercake;
battercake=new BaseBattercake();
battercake=new EggDecorator(battercake);
battercake=new EggDecorator(battercake);
battercake=new SausageDecorator(battercake);
//跟静态代理最大的区别就是职责不同
//静态代理不一定满足is-a的关系
//静态代理会做功能增强,使同一职责变得不一样
//装饰者模式更多考虑的是扩展
System.out.println(battercake.getMsg()+",总价:"+battercake.getPrice());
}
}
装饰者模式最本质的特征是将原有类的附加功能抽离出来,简化原有类的逻辑。通过案例可以总结出来,其实抽象的装饰者是可有可无的,具体可以根据业务模型来选择。