zoukankan      html  css  js  c++  java
  • Mediator(中介者模式)

    介绍

    一个大型电子公司想请你开发一款软件,用于操作他们最新的全自动洗衣机。该公司提供给你它的硬件规范以及该机器的功能。在规范中,他们提供了不同的洗衣程序。他们想要提供完全自动的不需要人介入的清洗过程。用户只需要将水管与机器连接,放入衣物,指定衣物的类型如棉,丝或纤维等,然后按开始键就好了。

    机器应该足够聪明,当需要水的时候,就把水冲入洗衣机的滚筒里面。它应该能够根据衣物的类型,开启加热器来提供适合清洗的温度。它应给能根据衣物尽快的启动马达,转动滚筒,然后冲洗衣物,如果需要的话,它还能使用去污剂和软化剂。

    作为一个面向对象的开发者,你开始分析和归类对象,类以及它们的关系。让我们检查该系统中某些重要的类和部件。首先,一个_Machine_类,具有一个滚筒。因此,就有一个_Drum_类,同样也就有_Heater_,Sensor_和一个_Motor_类。此外,机器应该有一个_Valve_控制水的流量,以及_SoilRemovalDetergentsoftener

    这些类相互之间有非常复杂的关系,而且关系也是变化的。请注意当前我们讨论的是机器的高级抽象。如果我们设计时,不考虑面向对象的原则和模式,那么最初的设计将会是紧耦合的,难以维护的。这是因为以上的类需要相互交互才能完成工作。比如,_Mathine_应该通知_Valve_来打开阀门,Motor_根据清洗程序的设置以特定的转速转动_Drum(轮毂)。某些类型的衣服需要软化剂或去污剂而其它的不需要,以及针对不同的衣物,要设置不同的温度等。

    如果我们让类直接交互,也就是说,提供一个引用,那么设计就会紧紧的耦合在一起,而且难以维护。将会难以改变一个类的同时不影响其它类。更糟糕的是,根据不同的清洗程序,类之间的关系是会改变的,就像不同类型的衣物,需要不同的温度。因此,这些类是难以重用的。更更糟糕的是,为了支持所有的清洗程序,我们需要将控制语句如if-else放在代码中,而这将让代码更加复杂和难以维护。

    为了将这些对象各自解耦,我们需要一个中介者,让它来与各个对象交互,以此来提供松散的耦合。各个对象只需要知道中介者,然后让中介者执行相应的操作就好了。中介者会根据需要执行各种操作,来完成工作。

    中介者模式是最适合这个情况的了,解决这个问题之前,我们来了解下中介者模式。

    什么是中介者模式

    中介者模式——定义封装了一系列对象交互逻辑的一个对象。中介者通过让对象之间隐式的引用,降低了耦合,使得你可以独立的改变他们的交互逻辑。

    对象之间不直接交互,对象让中介者代表自己来交互,以此提高重用性和松耦合。它将对象间的交互封装,使它们相互对立。这样,当需要改变对象之间的交互逻辑时,只需要再提供一个新的中介者就好。中介者较少了类的复杂度。每个对象不在需要知道与其它对象该怎样交互。对象见的耦合度从紧密脆弱变得松散又强壮。

    在使用中介者模式前,类之间的交互可能是这样的(甚至c1,c4/c2,c3直接也交互):

    现在,在我们应用了中介者模式之后,类之间的交互应该是这样的,各个类只包含一个中介者引用:

    当有一系列对象紧密耦合在一起的时候,中介者模式应该是你的第一选择。让我们看看中介者模式的正式结构:

    如上图,那些保持着对中介者类引用的类叫做同僚,也就是同僚之间合作完成工作。中介者模式的主要成员如下:

    • Mediator:定义与_Colleague_通信的接口
    • ConcreteMediator:_Colleague_对象之间具体的交互逻辑,它维护者一组_Colleague_和它们之间的交互逻辑
    • Colleague:每一个_Colleague_类都知道它自身的_Mediator_对象。每一个_Colleague_要与其它_Colleague_通信时,都是与自己的_Mediator_通信
  • 相关阅读:
    普通javaBean获取Spring托管对象
    java 线程安全问题
    MySQL之alter语句用法总结
    Maven pom.xml配置
    Srping框架初识
    win7(64位)下memcache安装时报错“ failed to install service or service already installed”
    activemq 使用
    elasticsearch plugin
    logback.xml 实例
    Intellij IDEA 插件
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/6358560.html
Copyright © 2011-2022 走看看