装饰者模式
扩展原有对象的功能:
我买个房子(对象),我装修(不在原有的对象上进行操作),就是装饰者,动态添加,动态撤销
接下来我用代码举例子:
早晨我要买早餐,买的煎饼(对象),(装饰者)我有点饿加一个鸡蛋,再加一个香肠,在加一包辣条,我感觉吃不饱,我又加了一个鸡蛋
在原有的基础上进行扩展
抽象煎饼类煎饼的描述,价格
public abstract class ABattercake {
protected abstract String getDesc();
protected abstract int cost();
}
定义抽象煎饼装饰者,继承自抽象煎饼
public abstract class AbstractDecorator extends ABattercake {
private ABattercake aBattercake;//将抽象煎饼类
public AbstractDecorator(ABattercake aBattercake) {
this.aBattercake = aBattercake;
}
protected abstract void doSomething();
@Override
protected String getDesc() {
return this.aBattercake.getDesc();
}
@Override
protected int cost() {
return this.aBattercake.cost();
}
}
煎饼类
public class Battercake extends ABattercake {
@Override
protected String getDesc() {
return "煎饼";
}
@Override
protected int cost() {
return 8;
}
}
鸡蛋装饰者类
public class EggDecorator extends AbstractDecorator {
public EggDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected void doSomething() {
}
@Override
protected String getDesc() {
return super.getDesc()+" 加一个鸡蛋";
}
@Override
protected int cost() {
return super.cost()+1;
}
}
香肠类
public class SausageDecorator extends AbstractDecorator{
public SausageDecorator(ABattercake aBattercake) {
super(aBattercake);
}
@Override
protected void doSomething() {
}
@Override
protected String getDesc() {
return super.getDesc()+" 加一根香肠";
}
@Override
protected int cost() {
return super.cost()+2;
}
}
运行:
ABattercake aBattercake;
aBattercake = new Battercake();
aBattercake = new EggDecorator(aBattercake);
aBattercake = new EggDecorator(aBattercake);
aBattercake = new SausageDecorator(aBattercake);
System.out.println(aBattercake.getDesc()+" 销售价格:"+aBattercake.cost());
运行结果:
煎饼 加一个鸡蛋 加一个鸡蛋 加一根香肠 销售价格:12
由上看出装饰者的存在 jdk源码中FileInputStream,OutPutStream,都是装饰者模式