适用性:
1 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责,
2 处理那些可以撤销的职责
3 当不能采用生成子类的方法进行扩产时。
参与者:
1 Component
定义一个对象接口,可以给这些对象动态添加职责
2 ConcreteComponent
定义一个对象,可以给这个对象添加一些职责
3 Décorator
维持一个指向Compoent对象的指针,并定义了一个与Compoent接口一致接口。
4 ComcreteDecorator
向组件的添加职责
例子:
publicclass Man implements Person {
@Override
publicvoid eat() {
System.out.println("人在吃饭");
}
}
//interfacePerson
publicinterface Person {
publicvoid eat();
}
//Decorator
public abstractclass Decorator implements Person {
private Person p ;
publicvoid setP(Person p) {
this.p = p;
}
@Override
publicvoid eat() {
p.eat();
}
}
//ConcreteDescoratorA
publicclass ManDescoratorA extends Decorator {
@Override
publicvoid eat() {
super.eat();
reEat();
System.out.println("ManDescoratorA 类");
}
privatevoid reEat() {
System.out.println("再吃一顿!!");
}
}
//ConcreteDescoratorB
publicclass ManDescoratorB extends Decorator {
@Override
publicvoid eat() {
super.eat();
System.out.println("============");
System.out.println("ManDescoratorB 类");
}
}
//main主函数
publicclass TestDescorator {
publicstaticvoid main(String[] args) {
Man man = new Man();
ManDescoratorA mdA = new ManDescoratorA();
ManDescoratorB mdB = new ManDescoratorB();
mdA.setP(man);
mdB.setP(mdA);
mdB.eat();
}
}
运行结果:
人在吃饭
再吃一顿!!
ManDescoratorA类
============
ManDescoratorB类
总结:从以上的代码我们可以发现装饰者模式比继承更加的灵活,避免了继承体系的臃肿,而且降低了类与类之间的耦合度,我们常常看到和使用到的有For 的增强循环、IO包中的ReadLine()方法对read()方法的增强;装饰者类因为已经增强了已有对象,具备的功能和已有的功能一样,只不过提供了增强类的功能,所以装饰者和被装饰者都属于一个类体系中
|