装饰者模式:
什么是装饰者模式:动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。
装饰者模式又称为包装模式,它主要是为了扩展对象的功能,包装类通过持有对象的引用(将对象传到包装类里面(聚合)),把对象包装起来,可以在调用对象的方法之前或者之后增加新的功能,以达到给对象添加一些额外的职责,就像为对象添加了一些装饰。
另一个要点是,包装者可以有很多个,对象被包装了一层之后,依然可以继续再包装来添加新的职责。添加职责的目的其实就是为了扩展对象的功能,通过使用装饰者模式可以使得系统具有非常好的弹性。遵循了面向对象原则:对扩展开放,对修改关闭。如果有新的需求变更,对象功能扩展,只需要新增一个装饰者类,将对象包装起来即可扩展对象的功能,而不需要对旧有对象代码进行修改。
装饰者类图:
装饰者模式和桥接模式的区别
1.定义
装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立的变化。
桥接模式就是应用合成/聚合复用原则的模式,而装饰模式是使用继承方式的模式。所以区别之一就出来了,一个使用的是继承方式,另一个使用的却是合成方式。桥接模式耦合程度更低,两个(多个)维度的东西可以分别拥有自己的属性和方法;装饰者模式使用继承(实际也有聚合),必然有相同的属性和方法。
桥接模式是为了实现两个没有关联的维度的东西的自由组合,这里没有关联是指各自拥有自己的属性和方法,没有相同点(使用聚合或者组合)。装饰者模式使用了继承必然是两个种类具有相同的一些属性和方法,它不是为了实现两个维度的自由组合,是为了实现对对象的一层一层又一层包装,调用方法时,每一层包装递归的调用上一层的包装。
这里的包装可以举一个例子,如同月饼的包装,可以包一层,再包一层,再包一层,每一层的包装可以形同也可以不同。装饰者模式将月饼传入装饰类,每包一次就将上一次包好的月饼传入装饰类,进行下一次的包装。
2.角度不同
装饰模式是动态地添加一些额外功能的模式,也就是说装饰模式是适应新需求而添加新功能,并且不影响其他对象的一种模式;而桥接模式是适应变化维度的一种模式,它在于将对象的各个维度的变化都独立开来,使一些变化不受其他因素变化的影响。
3.“独立”不同
装饰模式中实现的是不同功能的子类进行封闭后独立的子类,但仍旧是紧耦合(因为是继承方式),而桥接模式中是将变化独立开,降低类之间的耦合度,尽最大可能实现松耦合(组合方式)。
4.适用性
装饰模式的适用性:
1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2)处理那些可以撤消的职责。
3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
桥接模式的适用性:
1).如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2).设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3).一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4).虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。