首先谈谈装饰器模式,装饰器模式是可以动态的赋予对象本身没有的功能,注意动态的添加,也就是说这种添加是在运行时而非编译时。
再谈谈装饰器模式,比如某商场卖芭比娃娃,然后假设现在只有一种芭比娃娃,长头发、白色连衣裙、红色高跟鞋
系统对这个芭比娃娃进行模拟
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就可以了