装饰模式可以给一个对象动态的添加一些额外的职责(通过装载兄弟类对象的方式)。就增加功能来说,装饰模式比生成子类更加灵活。
接下来我举一个例子:
Finery类是Person类的子类。
BigTrouser类和TShirt类是 Finery类的子类。
现在想给BigTrouser类的对象 添加穿TShirt的功能,就要采用装饰模式。
先上代码:
package com.wjy.decorator; public class Person { private String name; public Person(){ } public Person(String name){ this.name=name; } public void Show(){ System.out.println("装扮:"+name); } }
package com.wjy.decorator; public class Finery extends Person{ protected Person component; public void Decorator(Person component) { this.component=component; } @Override public void Show() { // TODO Auto-generated method stub if(component!=null) { component.Show(); } } }
package com.wjy.decorator; public class TShirts extends Finery{ public TShirts() { super(); } public void Show() { super.Show(); System.out.println("大体恤"); } }
package com.wjy.decorator; public class BigTrouser extends Finery{ public BigTrouser() { super(); // TODO Auto-generated constructor stub } public void Show(){ super.Show(); System.out.println("裤头"); } }
在Main方法中是这样调用的:
package com.wjy.decorator; public class Start { public static void main(String[] args){ //Person person=new Person("小菜"); BigTrouser bigtrouser=new BigTrouser(); TShirts tShirts=new TShirts(); //tShirts.Decorator(person); bigtrouser.Decorator(tShirts); bigtrouser.Show(); } }
如上所示:BigTrouser类的对象将TShirt类的对象包含在自己聚合的Person对象中,这样在BigTrouser类的处理代码中调用super.处理函数();而在BigTrouser类和TShirt类的共同的父类中的 处理函数是这样写的 component.处理函数(); 就是说要调用 BigTrouser对象中聚合的Person对象(就是TShirt的对象)的处理方法,这样一来,BigTrouser对象一调用方法实质上是先调用了TShirt类的处理方法,再调用自己的处理方法。这样一来就使得这个BigTshirt对象拥有了处理TShirt的功能。