[置顶] 欢迎您。今天是2023年03月30日。

变化预防模式(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,跟它直接依赖的对象有:

  1. A对象本身
  2. A的属性成员对象
  3. 通过参数传送给A的对象(A的方法里参数)
  4. A的方法内部生成的对象

为什么说LoD跟实现Protected Variations模式的考虑方法一致呢?

我们举例来说明。

假如,系统需要实现这样一个功能,把一段字符串保存到文件,打印机等输出设备。

这是一个可变的或者说存在不安定因素的功能需求,因为输出设备除了文件,打印机之外,还可能有数据库,屏幕终端,网络输出流等。

应用Protected Variations模式,我们为其定义一个能实现输出功能的稳定接口IOutputer,而具体的功能在具体的子类中实现,比如打印机输出类PrinterOutputer,数据库输出类DatabaseOutputer,文件输出类FileOutputer等。

使用此“输出功能”的用户只要知道接口就行了。

也就是说,对于用户来说,用户的直接依赖对象只有父接口IOutputer,至于其子类诸如PrinterOutputer,DatabaseOutputer,FileOutputer等都属于陌生人。

应用Protected Variations模式的好处:

  1. 提高系统对变化的应对能力。一旦系统的可预见的不安定因素发生变化(比如追加功能等),只需要生成一个已有的稳定接口的实现类就可以了,无需修改原来的类。
  2. 高内聚。具体的功能在各子类中实现,各类的内部功能具有高度聚集性。
  3. 低耦合。用户类只跟稳定接口通信,减少了跟其它陌生对象的关联的机会,降低了类之间的耦合性。

Protected Variations模式的应用例

例:把一段字符串保存到文件,打印机等输出设备。

应用Protected Variations模式的类图:

您可能也喜欢

GRASP是General Responsibility Assignment Software patterns(通用职责分配软件模式)的简称,它的核心思想是“职责分配(Responsibility Assignment)”。GRASP提出了几个基本原则,用来解决面向对象设计的一些问题。

信息专家模式(Information Expert)是GRASP模式中解决类的职责分配问题的最基本的模式。

创建者模式(Creator)是GRASP模式中解决类的实例的创建职责问题的模式。

二维码
摄像头