王吉元-NWPU

导航

 

装饰模式可以给一个对象动态的添加一些额外的职责(通过装载兄弟类对象的方式)。就增加功能来说,装饰模式比生成子类更加灵活。

接下来我举一个例子: 

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的功能。

posted on 2013-05-03 16:00  王吉元  阅读(119)  评论(0编辑  收藏  举报