变化预防模式(Protected Variations)是GRASP扩展模式之一,它设计稳定的接口来应对将来可能发生的变化或其它不安定的因素。
问题:
对存在于系统,子系统,或对象等元素中的各种变化或不安定的因素,为了不产生对其他元素的不利影响,在它们中间应该怎么样分配职责?
Protected Variations模式所提倡的解决方案:
Protected Variations模式提倡在可预测的变化或不安定因素的周围,用稳定的接口来承担职责。
在面向对象设计中,面向接口编程便符合Protected Variations模式的概念。
有人把Protected Variations模式称为Don't Talk to Strangers(别跟陌生人说话)。因为它跟实现Protected Variations模式的考虑方法一致。
Don't Talk to Strangers别名Demeter法则:(LoD: the Law of Demeter),它的基本原则是:只跟直接依赖的对象通信(不要耦合没有明显通信需求的2个对象),也就是说2个对象之间,能不关联的就尽量不要关联。
所谓直接依赖的对象,例如有一个对象A,跟它直接依赖的对象有:
- A对象本身
- A的属性成员对象
- 通过参数传送给A的对象(A的方法里参数)
- A的方法内部生成的对象
为什么说LoD跟实现Protected Variations模式的考虑方法一致呢?
我们举例来说明。
假如,系统需要实现这样一个功能,把一段字符串保存到文件,打印机等输出设备。
这是一个可变的或者说存在不安定因素的功能需求,因为输出设备除了文件,打印机之外,还可能有数据库,屏幕终端,网络输出流等。
应用Protected Variations模式,我们为其定义一个能实现输出功能的稳定接口IOutputer,而具体的功能在具体的子类中实现,比如打印机输出类PrinterOutputer,数据库输出类DatabaseOutputer,文件输出类FileOutputer等。
使用此“输出功能”的用户只要知道接口就行了。
也就是说,对于用户来说,用户的直接依赖对象只有父接口IOutputer,至于其子类诸如PrinterOutputer,DatabaseOutputer,FileOutputer等都属于陌生人。
应用Protected Variations模式的好处:
- 提高系统对变化的应对能力。一旦系统的可预见的不安定因素发生变化(比如追加功能等),只需要生成一个已有的稳定接口的实现类就可以了,无需修改原来的类。
- 高内聚。具体的功能在各子类中实现,各类的内部功能具有高度聚集性。
- 低耦合。用户类只跟稳定接口通信,减少了跟其它陌生对象的关联的机会,降低了类之间的耦合性。
Protected Variations模式的应用例
例:把一段字符串保存到文件,打印机等输出设备。
应用Protected Variations模式的类图:
最新评论