原有对象的基础上,功能附加。
装饰器模式是一种特殊的代理模式,强调的是装饰器的扩展。
应用场景
- 字节流
InputStream in = new InputStream();
BufferReader br = new BufferReader(in);
类结构图
Battercake: 接口,装饰类和被装饰类的基本类型。
BattercakeImpl:具体实现类(被装饰类),本身具备完整的功能。
BattercakeDecorator:装饰类。实现接口Battercake 并持有BaseBattercake 的引用。用于生产装饰的子类,其子类才是赋有装饰效果的装饰产品类。
EggBattercakeDecoratorImpl:具体的装饰产品类,可以通过构造声明对哪种实现类做装饰。
代码实现
定义一个接口 Battercake
public interface Battercake { //煎饼接口(现有的)
String getMessage();
int getPrice();
}
原有的实现类 BattercakeImpl
public class BattercakeImpl implements Battercake { //煎饼实现类(现有的)
@Override
public String getMessage() {
return "获取一个煎饼";
}
@Override
public int getPrice() {
return 3;
}
}
基础的装饰类 BattercakeDecorator,
实现原接口,从而达到原有的接口不变。 持有原实现类的对象引用,从而达到在原有的基础上,功能附加。
public class BattercakeDecorator implements Battercake{ // 装饰类
private Battercake battercake;
public BattercakeDecorator(Battercake battercake) {
this.battercake = battercake;
}
@Override
public String getMessage(){
return battercake.getMessage();
}
@Override
public int getPrice(){
return battercake.getPrice();
}
}
装饰器的扩展类1 EggBattercakeDecoratorImpl
继承基础装饰器类,重点在于 super的使用。从而达到在原有的基础上,功能附加。
public class EggBattercakeDecoratorImpl extends BattercakeDecorator { //鸡蛋装饰类
public EggBattercakeDecoratorImpl(Battercake battercake) {
super(battercake);
}
@Override
public String getMessage() {
return super.getMessage() + " 加一个鸡蛋";
}
@Override
public int getPrice() {
return super.getPrice() + 2 ;
}
}
装饰器的扩展类2 HotdogBattercakeDecoratorImpl
public class HotdogBattercakeDecoratorImpl extends BattercakeDecorator {//热狗装饰类
public HotdogBattercakeDecoratorImpl(Battercake battercake) {
super(battercake);
}
@Override
public String getMessage() {
return super.getMessage() + " 加一个热狗";
}
@Override
public int getPrice() {
return super.getPrice() + 5 ;
}
}
测试类
public class Client {
public static void main(String[] args) {
Battercake battercake = new BattercakeImpl();
BattercakeDecorator decorator = new BattercakeDecorator(battercake);
EggBattercakeDecoratorImpl egg = new EggBattercakeDecoratorImpl(decorator);
HotdogBattercakeDecoratorImpl hotdog = new HotdogBattercakeDecoratorImpl(egg);
System.out.println(hotdog.getMessage() +" : "+ hotdog.getPrice());
}
}
输出结果:获取一个煎饼 加一个鸡蛋 加一个热狗 : 10