定义:
用于在运行时修改或者扩展实例的行为。即对某一个对象的行为进行扩展,而不是对某一类对象的行为进行扩展(针对类的所有对象可以采用继承的方式)
优势:
通过使用装饰模式,我们可以对某个类的某一个对象进行动态扩展。而不会影响该类的其他实例。
而采用继承的方式会直接为类增加功能,导致子类数量膨胀。
装饰模式不改变原类文件、不使用继承、可以动态地扩展类功能
UML类图:

代码实现:
我们通过房子来描述这个装饰的过程
1:盖一栋基本的房子
2:给外墙上色
3:安装家灯
待装饰的父接口:

被装饰的具体对象:

装饰者抽象类:

具体的装饰者一:房屋刷颜色

具体的装饰者二:房屋装灯

测试类:

结果:

结语:
可以发现,其实装饰者就是一个被装饰者,装饰的过程其实就是拿到被装饰者的实例引用,用装饰者改变被装饰者的行为或者扩展它的功能的过程。
记住该模式的重点是:运行时动态变化
提问:
继承与装饰者模式的区别?为什么不能用继承来增加被装饰者想要的功能呢?
1:继承的形式,需要子类继承我们的被装饰类,通过添加房子的子类来添加特定的颜色或者装饰灯。但是如果我们想要添加各种各样的颜色和装饰灯呢?就必须在房屋代码编写时就定义好各种各样的子类(如红色房屋,黄色房屋,绿色房屋,大灯房屋,小灯房屋...),而装饰模式并不需要逐个创建子类房屋,而是在运行时将需要装饰的房屋子类与特定装饰类联系即可。即:
运行时为独立对象装饰新的功能。
网友评论