装饰器模式

首先谈谈装饰器模式,装饰器模式是可以动态的赋予对象本身没有的功能,注意动态的添加,也就是说这种添加是在运行时而非编译时。

再谈谈装饰器模式,比如某商场卖芭比娃娃,然后假设现在只有一种芭比娃娃,长头发、白色连衣裙、红色高跟鞋

系统对这个芭比娃娃进行模拟

class BabiDoll 

{

 String hair;

 String  clothes;

  void exceute(){};

  ...

}

经过一段时间,商场又开始更新一种会跳舞的芭比娃娃,

class DanCeBabiDoll extends BabiDoll

{

  void exceute(){...dance};

}

又过了一段时间,商场又更新了一种会唱歌的洋娃娃

class SingBabiDoll extends BabiDoll

{

  void  exceute(){...sing};

}

又过了一段时间,商场又更新了一种既会唱歌,又会跳舞的洋娃娃

但是总不能每次增加一个新的系列,就增加一个实体类吧,这样后面岂不是要写N种芭比娃娃,而且唱歌、跳舞的动作执行都是一样的,这样写下去不但类爆炸而且重复代码会越来越多(试想后来又流行 唱歌、跳舞、讲故事的芭比娃娃)

那怎么办呢,我们装饰模式就上场了

我们对原始的BabiDoll类进行改造

Abstract class BabiDoll

{

  String hair;

  ...

  abstract void excute();

}

class RealBabiDoll extends BabiDoll

{

...

}

我们将芭比娃娃的行为抽离出来,芭比娃娃本身是不变的,变的是增加的行为

Abstract class BabiDollDecorator extends BabiDoll

{

  BabiDoll doll;//注意装饰类不仅是一个BabiDoll(被装饰类),而且本身内部还有一个传入的被装饰类

  

  void excute();

}

  class  SingBabiDecorator extends BabiDollDecorator

{

    BabiDoll doll;

    public SingBabiDecorator( BabiDoll doll)

    {

      this.doll = doll;

    }

   sing();

    void excute(){ this.doll.excute;sing();}; //仔细看,添加了sing的动作

}

再回到开始的问题,现在增加了一个会唱歌的洋娃娃,我们就不需要再创造实体类了

new SingBabiDecorator (new RealBabiDoll ());神奇吧,我们不需要再创建一个实体类了,假如再来一个跳舞动作

  class  DanceBabiDecorator extends BabiDollDecorator

{

    BabiDoll doll;

    public DanceBabiDecorator( BabiDoll doll)

    {

      this.doll = doll;

    }

   dance();

    void excute(){ this.doll.excute;dance();}; //

}

一个既会跳舞又会唱歌的芭比娃娃诞生了

new DanceBabiDecorator( new SingBabiDecorator (new RealBabiDoll ()));

以后新增动作我们只需要继承BabiDecorator就可以了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值