概述
装饰模式以对调用端透明的方式动态扩展对象的功能,是继承关系的一个替代方案。调用端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展
涉及角色
UML
使用场景
- 扩展一个类的功能
- 动态增加功能,动态撤销
优点
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
缺点
多层装饰比较复杂,产生过多相似的对象,不易排错!
代码示例
以服务生为例,新入行的服务生和老练的服务生,新入行的服务生会按照培训流程等进行接待客人,但老练的服务生会察言观色,可能会根据不同的人加入不同的沟通技巧。
package com.designpattern.decorator;
public interface Service {
public void service();
}
package com.designpattern.decorator;
public class NewWaiter implements Service {
@Override
public void service() {
// TODO Auto-generated method stub
System.err.println("请问您要点些什么");
}
}
package com.designpattern.decorator;
public class SkilledWaiter implements Service{
private Service service;
public SkilledWaiter(Service service) {
// TODO Auto-generated constructor stub
this.service= service;
}
@Override
public void service() {
// TODO Auto-generated method stub
System.err.println("欢迎光临本店");
service.service();
System.err.println("有需要您随时叫我");
}
}
package com.designpattern.decorator;
public class TestMain {
public static void main(String[] args) {
Service waiter = new NewWaiter();
Service waitress = new SkilledWaiter(waiter);
waitress.service();
}
}
运行结果:
欢迎光临本店
请问您要点些什么
有需要您随时叫我