今天上课时老师提到了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{
} |
| publicclassDecoratorimplementsIUsb{ //额外增加的功能被打包在这个List中 private ArrayList others = new ArrayList(); publicDecorator(IUsb_usb){ } publicclassDecoratorimplementsIUsb{ publicDecorator(IUsb_usb){ publicvoidreadData(){//其实执行的是IUSB的ReadData publicvoidwriteData(){//其实执行的是IUSB的WriteData //音乐播放器,提供播放音乐的功能 publicvoidplayMusic(){ //照相机 publicvoidtakePicture(){ publicclassTestDecorator{ Cameramp3Carm=newCamera(player); |
实际上Java 的I/O API就是使用decorator,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.
装饰器
装饰器实现了对被装饰对象的某些装饰功能,可以在装饰器里面调用被装饰对象的功能,获取相应的值,这其实是一种递归调用。
在装饰器里不仅仅是可以给被装饰对象增加功能,还可以根据需要选择是否调用被装饰对象的功能,如果不调用被装饰对象的功能,那就变成完全重新实现了,相当于动态修改了被装饰对象的功能。
另外一点,各个装饰器之间最好是完全独立的功能,不要有依赖,这样在进行装饰组合的时候,才没有先后顺序的限制,也就是先装饰谁和后装饰谁都应该是一样的,否则会大大降低装饰器组合的灵活性。
本文深入探讨了装饰器模式在Java编程中的应用,通过实例解释了如何使用装饰器模式动态地为对象添加功能,同时保持代码的灵活性与简洁性。文中详细对比了普通继承模式与装饰模式在实现相同功能时的区别,并通过具体代码展示了装饰器模式的实际应用,包括接口定义、具体实现类以及装饰类的构建过程。

7328

被折叠的 条评论
为什么被折叠?



