今天上课时老师提到了decorator装修模式,觉得还是很有意思的,就在网上搜集了,相关资料,现在结合自己的理解写在下面,如有不对的地方请各位大虾拍砖指教。
总结:
decorator装修模式的目的:
简化继承派生模式,使用“即插即用”,增加灵活性与使用性。
实现:
实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。当装饰过后,从外部使用系统的角度看,就不再是使用原始的那个对象了,而是使用被一系列的装饰器装饰过后的对象。
M
--------------------------
普通继承模式实现
A
B
C
M1: A
M2: B
M3: C
M4:A B
M5:A C
M6:B C
M7:A B C
---------------------------
装饰模式
M
|--M1
|--M2
|--M3
A B : new M2(M1)
A C : new M3(M1)
B C : new M3(M2)
A B C : new M3(M2(M1))
我们先建立一个接口:
public interface IUsb{ |
接口u盘有一个具体实现:读数据,写数据,同理mp3
//U盘public class UDisk implements IUsb{
} public MP3Play implements IUsb{
} |
public class Decorator implements IUsb{ //额外增加的功能被打包在这个List中 private ArrayList others = new ArrayList(); public Decorator(IUsb _usb){ }
public class Decorator implements IUsb{ public Decorator(IUsb _usb){ public void readData(){//其实执行的是IUSB的ReadData public void writeData(){//其实执行的是IUSB的WriteData // 音乐播放器,提供播放音乐的功能 public void playMusic(){ // 照相机 public void takePicture(){ public class TestDecorator{ Camera mp3Carm = new Camera(player);
|
实际上Java 的I/O API就是使用decorator,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.
装饰器
装饰器实现了对被装饰对象的某些装饰功能,可以在装饰器里面调用被装饰对象的功能,获取相应的值,这其实是一种递归调用。
在装饰器里不仅仅是可以给被装饰对象增加功能,还可以根据需要选择是否调用被装饰对象的功能,如果不调用被装饰对象的功能,那就变成完全重新实现了,相当于动态修改了被装饰对象的功能。
另外一点,各个装饰器之间最好是完全独立的功能,不要有依赖,这样在进行装饰组合的时候,才没有先后顺序的限制,也就是先装饰谁和后装饰谁都应该是一样的,否则会大大降低装饰器组合的灵活性。