设计模式学习之装饰者模式
概述
23种设计模式之一,英文名Decorator Pattern,又叫装饰者模式。装饰者模式是在不改变原类文件和继承关系的情况下,动态地扩展一个对象功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
特点
- 装饰对象和真实对象有共同的接口,这样客户端对象就能按照和真实对象相同的方式和装饰对象交互;
- 装饰对象包含一个真实对象的引用,通过构造函数的传参来确定要装饰的对象;
- 装饰对象接受所有来自客户端对象的请求。它把这些请求转发给真实的对象;
- 装饰对象可以再转发这些请求以前或者以后增加一些附件功能。这样就确保了再运行时,不用修改给定对象的结构就可以再外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
优点
- 相比于继承方式扩展对象的功能,装饰者模式具有更多的灵活性;
- 通过不同的具体装饰类以及排列组合,可以方便的设计不同行为的组合;
缺点
- 灵活性也就意味着复杂性;
- 装饰者模式会出现很多小类,过度使用会导致程序会什么复杂;
设计原则
- 多用组合,少用继承;
- 对扩展开发,对修改关闭;
MusicPhoneDecrote music = new MusicPhoneDecrote(new RingPhoneDecrote(new phone()));
music.call();
RingPhoneDecrote ring = new RingPhoneDecrote(new MusicPhoneDecrote(new phone()));
ring.call();
其中,phone.java内容
public class phone implements IPhone{
public void call(){
System.out.println("call........");
}
}
RingPhoneDecrote.java内容
public class RingPhoneDecrote extends PhoneDecrote {
public RingPhoneDecrote(IPhone phone) {
super(phone);
}
@Override
public void call() {
System.out.println("ring....");
super.call();
}
}