装饰器模式,在不改变对象自身的基础上,在程序运行期间给对象动态的添加职责。装饰器模式非常像继承特性,不改变父类,子类可扩展功能。
装饰器模式优点
- 装饰类和被装饰类可以独立发展,不会相互耦合;
- 相比于继承,更加的轻便、灵活;
- 可以动态扩展一个实现类的功能,不必修改原本代码;
装饰器模式缺点
- 会产生很多的装饰类,增加系统复杂性;
- 容易出错,排错困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为繁琐;
装饰器模式和代理模式的区别
- 代理是全权代理,目标根本不对外,全部由代理类来完成;装饰是增强,是辅助,目标仍然可以自行对外提供服务,装饰器只起增强作用;
- 代理模式强调的是对代理的对象施加控制,但不对对象本身的功能进行增强;装饰器模式强调的是增强、新增行为;
- 代理模式生效的是新的对象(代理对象);装饰器模式生效的对象还是原本的对象;
实例:定义一个Person接口,其实现类有Father、Mother、Child,实现Person接口中的drink方法,再定义一个装饰器类,实现Person接口,对drink方法进行装饰。好比喝水,对喝水方法进行添加点热水,然后再喝。
public interface Person {
/**
* 喝水
*/
void drink();
}
public class Father implements Person {
@Override
public void drink() {
System.out.println("father drink water");
}
}
public class Mother implements Person {
@Override
public void drink() {
System.out.println("mother drink water");
}
}
public class Child implements Person {
@Override
public void drink() {
System.out.println("child drink water");
}
}
public class ColdDecorator implements Person {
private Person person;
public ColdDecorator(Person person) {
this.person = person;
}
@Override
public void drink() {
System.out.println("decorator cold water...");
person.drink();
}
}
public class Test {
public static void main(String[] args) {
Person father = new Father();
father = new ColdDecorator(father);
father.drink();
Person mother = new Mother();
mother = new ColdDecorator(mother);
mother.drink();
Person child = new Child();
child = new ColdDecorator(child);
child.drink();
}
}
测试结果如下