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

装饰器模式(Decorator)


原有对象的基础上,功能附加。
装饰器模式是一种特殊的代理模式,强调的是装饰器的扩展。

应用场景

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值