设计模式-装饰模式简单理解

装饰模式是一种比较简单的模式,为什么要用它呢?怎么用呢?

前期需求:实现三个了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调用时决定装饰类和被装饰类之间关系。

 

posted on 2018-12-25 10:18  SimpleWorker  阅读(186)  评论(0编辑  收藏  举报

导航