装饰模式是一种比较简单的模式,为什么要用它呢?怎么用呢?
前期需求:实现三个了A B C,定义相同的调用方法,客户可以有选择的调用任意一个。
我知道对接口编程,于是我定义了一个接口
interface O{
public void do();
}
然后我根据需求定义三个O的实现:A,B,C。
接下来的剧情:
1. 新需求来了:客户要在O的实现对象上增加功能F1或F2或F3。
怎么做?现在只有A B C三个,我用if else加上F1 F2 F3的支持:
if(1) do F1 else if (2) do F2 else if(3) do F3;
OK了!
2. 新需求又来了:O的实现类要增加 X ,Y, Z。
怎么做?我增加三个实现类,然后在实现类上再加上if else支持F1 F2 F3。
3. 新需求又又来了:功能需要增加对F4 F5 F6的支持。
怎么做?我再把O的所有的实现类再改一遍,加上if else支持F4 F5 F6。改完了,好累啊!!!但愿需求不要再变化。。。
本来生活可以很简单的呀!我也可以这样做:
反转的剧情:
1. 新需求来了:客户要在O的实现对象上增加功能F1或F2或F3。
怎么做?
class F1 implements O{
O o = null;
public F1(O o){this.o = o;}
public void do(){
o.do();
do something about F1
}
}
同样F2 F3也这么做。
如果用户要用F1的功能的话就可以:new F1(o).do(); ----o为被装饰的对象
如果要用F1,F2功能:new F2(new F1(o)).do();
如果要用F1,F2,F3功能:new F3(new F2(new F1(o))).do();
2. 新需求又来了:O的实现类要增加 X ,Y, Z。
怎么做?我只需要增加三个类 X Y Z,实现O接口就好了,至于你怎么用,自己装饰去吧!
3. 新需求来了:功能需要增加对F4 F5 F6的支持。
怎么做?简单,跟F1的定义类似啊,分分钟搞定。至于你怎么用,自己装饰去吧!
^^) ,这种俄罗斯套娃模式是不是有种似曾相识的感觉呢?java IO中输入输出流
采用装饰模式可以把装饰类和被装饰的类解耦,二者都可以增加新的类,而彼此不受影响。Client调用时决定装饰类和被装饰类之间关系。
原文地址:https://www.cnblogs.com/onetwothree/p/10157150.html