<三>读<<大话设计模式>>之装饰模式

 

        学习这个模式比前几个要难点了,搞了半天才弄懂。好吧,也许是我脑子慢

       装饰者模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

       《《大话设计模式》》一书中以“小菜”去约会需要打扮为例子来展开学习装饰模式的,对于该模式,本人的理解是:就是对一个已有的算法进行二次加工,但又不改变原来的代码,在原有的数据处理中再一次进行处理。

       好了不多说,通过代码去理解会更好一点,本人代码中的注解很关键,都是我在编写的过程中理解总结出来的,对理解装饰模式很关键。

1、人要打扮,要穿衣服,所以第一个对象是人

/*

 * 装饰模式

 * 要装饰的对象

 */

publicclass Person {

 

    private Stringname;

   

    public Person(){ }

   

    public Person (String name){

       this.name = name;

    }

   

    public void show(){

      

       System.out.println("装饰的"+name);

    }

}

2、装饰类,我要用衣服来装饰自己,所有要定义一个装饰类来作为具体装饰物的父类

/*

 * 装饰的衣服大类

 */

public class Fineryextends Person {

 

    private Personperson;

   

    //打扮谁

    publicvoid decorator(Person person){

       this.person = person;

    }

    @Override

    publicvoid show() {

       //TODO Auto-generated method stub

       if(person !=null){

           person.show();//实际执行的是person中的方法。为什么还要增加类Finery呢?因为人装饰的是衣服,而衣服有很多种(子类)

       }

      

    }

    public Person getPerson() {

       returnperson;

    }

    publicvoid setPerson(Person person) {

       this.person = person;

    }

 

}

3、T恤类,装饰物为T恤

/*

 * 具体的类,t恤,要装饰到人身上

 */

publicclass TShirtsextendsFinery {

 

    publicvoidshow(){

       System.out.println("穿上T恤!");//在实际开发中,此应该为对人数据进行处理的过程。

       super.show();//父类处理的过程

    }

}

4、裤子类

/*

 * 具体的类,裤子,要装饰到人身上

 */

publicclass BigTrouserextends Finery {

 

    publicvoidshow(){

       System.out.println("穿上裤子!");

       super.show();

    }

}

5、客户端调用类

publicclass DecoratorClient {

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

       //TODO Auto-generated method stub

 

       Personperson = new Person("我");

       TShirtstShirts = new TShirts();

       BigTrousertrouser = new BigTrouser();

      

       //装饰过程

       tShirts.decorator(person);

       trouser.decorator(tShirts);

       trouser.show();

    }

 

}

打印结果为:

穿上裤子!

穿上T恤!

装饰的我

分析打印结果:

         当程序执行到trouser.show()时,打印:穿上裤子!,这个没有问题,这个方法中还有一个方法是super.show(),此事super(父类)为TShirts对象,为什么呢?请看trouser.decorator(tShirts);这个就是将裤子的父类变成T恤了,所以super.show()方法其实执行的是T恤类中的System.out.println("穿上T恤!");  super.show();这两步,打印“穿上T”后,执行super.show(),此事super是谁呢?根据tShirts.decorator(person);可以看出就是Person本人了。这样会执行Person类中的show方法:System.out.println("装饰的"+name);即打印出装饰的我。好了介绍完了,这个对于我来说很难理解到。有问题留言哟,谢谢!

附上装饰模式的结构图

<三>读<<大话设计模式>>之装饰模式_第1张图片

总结:装饰模式是为已有功能动态的添加更多功能的一种方式。当系统需要更新功能的时候,是向旧的类中添加新的代码,这些新的代码通常装饰了原有类的核心职责或主要行为,比如穿T恤、裤子装饰自己,但这种做法的问题在于,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。

 

附上源代码地址:http://download.csdn.net/detail/jzhf2012/8086335

你可能感兴趣的:(设计模式,装饰模式)