http://oldboy-bj.taobao.com/

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

http://35java.com/zhibo/forum.php?mod=viewthread&tid=38&extra=page%3D4

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模*相比生成子类更为*活。



适用性



1.
在不影响其他*象的情况下,以动态、透明的方式给单个对象添加职责。


2.
处理那些可以撤消的职责。


3.
当不能采用生成子类的方法进行扩充时。





参与者



1.Component

定义一个对象接口,可以给这些对象动态地添加职责。


2.ConcreteComponent

定义一个对象,可以给这个对象添加一些职责。


3.Decorator

维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。


4.ConcreteDecorator

向组件添加职责。



类图





例子

Component


public interface Person {

void eat();
}

ConcreteComponent


*ublic class M*n implements Person {

public void eat() {


System.out.println("
男人在吃");
*
}

Decorator


public abstrac* class Decorator implements Perso* {

protected Person person*


public void setPerson(Person person) {

this.person = person;

}


public void eat() {

person.eat();

}
}

ConcreteDec*rator


publi* class ManDecoratorA extends Decorator {

public void eat() {

super.eat();

reEat();

Sy*tem.out.println("ManDecoratorA
类");
}


public void reEat() {

System.out.println("
再吃一顿饭");
*
}
public class ManDecoratorB extends Decorator *

public void eat() {

super.eat();

Syst*m.out.println("===============");

System.out.println("ManDecoratorB
类");
}
}

Test


public class Test {

public st*tic void main(Strin*[] args) {

Man man = new Man();

ManDecoratorA md1 = new ManDecoratorA();

ManDecoratorB md2 = n*w ManDecoratorB();


md1.setPerson(man);

md2.setPerson(md1);

md2.eat();

}
}

result


男人在吃
再吃一顿饭
ManDecoratorA
===============ManDecoratorB
posted on 2011-01-05 19:40  老男孩咖啡  阅读(112)  评论(0)    收藏  举报