装饰器模式(Decorator) 包装模式(Wapper)

tech2022-12-30  129

装饰器模式(Decorator)

应用场景类结构图代码实现 原有对象的基础上,功能附加。 装饰器模式是一种特殊的代理模式,强调的是装饰器的扩展。

应用场景

字节流 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

最新回复(0)