使用GoF模式完成更多对象设计

目标:

  • 在用例实现的设计中应用GoF和GRASP模式

示例:NextGen POS

后续小节将探讨如何应用各种模式和原则来解决NextGen案例迭代3中的各种需求,其中包括:

  • 原创服务访问失败时,使用本地服务容错。
  • 本地缓存。
  • 支持第三方POS设备。
  • 处理信用卡支付、借记卡支付和制品支付等。

本地服务容错:使用本地缓存提高性能

NextGen的需求之一时,当原创服务访问失败时,得到某种程度的恢复。访问产品信息服务时讨论恢复和容错设计策略的第一个案例。然后探讨账务服务,此情形的解决方案略微不同。

在解决容错和恢复方面的问题之前,为了提供效率以及增强从原创数据库访问失败中恢复的可能性,架构设计师建议使用ProductDescription对象的本地缓存。原创,在视图访问原创服务之前,应该总是首先在本地缓存中查找。

使用我们已有的适配器和工厂模式能够间接的实现这一特性:

  1. ServiceFactory总是返回本地产品信息服务的适配器。
  2. 本地产品“适配器”并不会真正地适配其他构件,它将子集复杂实现本地服务。
  3. 使用实际的原创产品服务适配器的引用来初始化本地服务。
  4. 如果本地服务在缓存中找到数据,就将数据返回;否则,将请求转发给外部服务。

处理故障

抛出异常

UML中的异常

处理错误

通过代理使用本地服务进行容错

通过在外部服务的前端添加本地服务,实现了产品信息的本地服务容错;使用中总是优先尝试本地服务。但是此设计方案并不是对所有的服务都使用。有时需要先尝试外部服务,然后才是本地服务。

在此情形下,GoF的代理模式可以解决这个问题。Proxy时一个简单的模式,作为其变体的原创代理模式使用官方。

Next案例中使用的代理不是远程代理变体,二十重定向代理变体,该代理也称为容错代理。

无论时哪种变体,代理的结构总是相同的;不同指出在于代理在被调用时做什么?

代理只不过时与被代理对象实现相同接口的对象,它保持指向被代理对象的引用,并且用于控制对被代理对象的访问。

  • 语境/问题:不希望或不可能直接访问真正的主题对象时,应该怎么办?
  • 解决方案:通过代理对象增加一层间接性,代理对象实现与主题对象相同的接口,并且复杂控制和增强对主题对象的访问。

对非功能性或质量需求的设计

在进入下一节之前,需要注意,到目前为止我们仅讨论了与可靠性和可恢复性相关的非功能性或质量需求,而不设计业务漏极。

由于的时,软件架构中的大型主题、模式和结构往往时通过解决非功能性或质量需求的设计而非基本业务漏极而形成的,这是软件架构的关键点。

使用适配器访问外部物理设备

对一组相关的对象使用抽象工厂模式

使用多态性和“Do It Myself”模式处理支付

示例:Monopoly案例

结论

results matching ""

    No results matching ""