以上述“用户注册”的用例为例,对于问题领域里的类“用户(User)”,如果把“数据库操作的职责”分配给“用户(User)”,那么User类的内聚性大大降低。
应用Pure Fabrication模式,应该人工定义一个数据库管理的概念类UserDbMgr,把数据库操作的功能分配给它完成。 如图:
如图,分离Domain类User与非Domain类UserDbMgr,User类只保持问题领域中的信息。保证了高内聚性,和易重用性。
GRASP Indirection Pattern - GRASP之间接性模式
间接性模式(Indirection)是GRASP模式中解决类的关联问题的模式。
问题
为了避免类之间的直接关联,应该给什么样的类分配“关联”责任?
Indirection模式所提倡的解决方案
当多个类之间存在复杂的消息交互(关联)时,Indirection模式提倡类之间不直接进行消息交互处理(非直接),而是导入第三方类,把责任(多个类之间的关联责任)分配给第三方类,降低类之间的耦合程度。
应用Indirection模式的好处
- - -
高内聚。通过把“关联”的功能分散到第三方类,原来的类可以更加关注自身功能的实现。
低耦合。原本关联类之间不直接关联,降低类之间的耦合性。
高重用性。第三方类对“关联”功能的集中处理,与原来的类对自身功能的专注,有利于类的重用。
Indirection模式的应用例
应用Indirection模式的一个最好范例是GoF的Mediator(中介者)模式。 参考:设计模式之Mediator - 中介者模式[GoF]
GRASP Protected Variations Pattern - GRASP之变化预防模式
变化预防模式(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模式的好处
- - -
Protected Variations模式的应用例
例:把一段字符串保存到文件,打印机等输出设备。 应用Protected Variations模式的类图:
提高系统对变化的应对能力。一旦系统的可预见的不安定因素发生变化(比如追加功能等),只需要生成一个已有的稳定接口的实现类就可以了,无需修改原来的类。 高内聚。具体的功能在各子类中实现,各类的内部功能具有高度聚集性。
低耦合。用户类只跟稳定接口通信,减少了跟其它陌生对象的关联的机会,降低了类之间的耦合性。
参考资料
Introducing Demeter and its Laws [LoD: the Law of Demeter]