阅读以下关于设计模式应用的叙述,根据要求回答问题。
[说明]
PH软件公司承接了某企业二期信息化软件开发项目,工程项目的研发任务之一是建设采购分级审批系统。该企业采购审批是根据采购金额的不同由不同层次的主管人员来审批,主任可以审批8万元以下(不包含8万元)的采购单,副董事长可以审批8~15万元(不包含15万元)的采购单,董事长可以审批15-45万元(不包含45万元)的采购单,45万元及以上的采购单就需要企业高层开会讨论决定。PH公司架构师采用某种设计模式设计的类图如图4—9所示。
[问题3]
结合你的系统架构经验,请用300字以内的文字指出Command模式、Observer模式、Chain ofResponsibility模式和Mediator模式在发送者和接收者解耦方面的区别。
参考答案:当合作的对象直接互相引用时,它们变得互相依赖,这可能会对一个系统的分层和重用性产生负面影响。Command模式、Obserwer模式、Chain of Responsibility模式和Mediator模式都涉及如何对发送者和接收者解耦,但它们又各有不同的权衡考虑。
命令模式使用一个Command对象来定义一个发送者和一个接收者之间的绑定关系,从而支持解耦,如图4—16所示。Command对象提供了一个提交请求的简单接口(即Execute操作)。将发送者和接收者之间的连接定义在一个单独的对象使得该发送者可以与不同的接收者一起工作。这就将发送者与接收者解耦,使发送者更易于复用。此外,可以复用Command对象,用不同的发送者参数化一个接收者。虽然Command模式描述了避免使用生成子类的实现技术,名义上每一个发送者一接收者连接都需要一个子类。
观察者模式通过定义一个接口来通知目标中发生的改变,从而将发送者(目标)与接收者(观察者)解耦,如图4-17所示。Observer定义了一个比Command更松的发送者一接收者绑定,因为一个目标可能有多个观察者,并且其数目可以在运行时变化。观察者模式中的Subject和Observer接口是为了处理Subject的变化而设计的,因此当对象间有数据依赖时,最好用观察者模式来对它们进行解耦。
职责链模式通过沿一个潜在接收者链传递请求而将发送者与接收者解耦,如图4-18所示。因为发送者和接收者之间的接口是固定的,职责链可能也需要一个定制的分发策略。因此它与Mediator一样存在类型安全的问题。如果职责链已经是系统结构的一部分,同时在链上的多个对象中总有一个可以处理请求,那么职责链将是一个很好地将发送者和接收者解耦的方法。此外,因为链可以被简单的改变和扩展,从而该模式提供了更大的灵活性。
中介者模式让对象通过一个Mediator对象间接的互相引用,从而对它们解耦,如图4—19所示。一个Mediator对象为各Colleague对象间的请求提供路由并集中它们的通信。因此各Colleague对象仅能通过Mediator接口相互交谈。因为这个接口是固定的,为增加灵活性Mediator可能不得不实现它自己的分发策略。可以用一定方式对请求编码并打包参数,使得Colleague对象可以请求的操作数目不限。中介者模式可以减少一个系统中的子类生成,因为它将通信行为集中到一个类中而不是将其分布在各个子类中。然而,特别的分发策略通常会降低类型安全性。