java设计模式之中介者模式

中介者模式

面向对象设计鼓励将行为分布到各个对象中, 这种分布可能会导致对象间有许多连接. 在最坏的情况下, 每一个对象都需要知道其他所有对象.

虽然将一个系统分割成许多对象可增强可复用性, 但是对象间相互连接的激增又会降低其可复用性. 大量的连接关系使得一个对象不可能在没有其他对象的协助下工作(系统表现为一个不可分割的整体), 此时再对系统行为进行任何较大改动就十分困难. 因为行为被分布在许多对象中, 结果是不得不定义很多子类以定制系统的行为. 由此我们引入了中介者对象Mediator:

通过中介者对象, 可以将网状结构的系统改造成以中介者为中心的星型结构, 每个具体对象不再与另一个对象直接发生关系, 而是通过中介者对象从中调停.中介者对象的引入,也使得系统结构不会因新对象的引入造成大量的修改.

中介者模式: 又称调停者模式, 用一个中介者对象(Mediator)来封装一系列对象的交互, 使各对象不需再显示地相互引用, 从而使耦合松散, 而且可以独立地改变他们之间的交互:

(图片来源: 设计模式: 可复用面向对象软件的基础)Tips: 各Colleague只知道Mediator的存在, 并不需要知道其他Colleague是否存在(不然怎么解耦呢), 它只需将消息发送给Mediator, 然后由Mediator转发给其他Colleague(由Mediator存储所有Colleague关系, 也只有Mediator知道有多少/哪些Colleague).

模式实现

联合国转发各国声明, 调停各国关系:
各国向联合国安理会发送和接收消息, 安理会在各国间'适当地'转发请求以实现协作行为:

Colleague

抽象同事类, 定义各同事的公有方法:

/**
 * @author jifang
 * @since 16/8/28 下午4:22.
 */
public abstract class Country {

 protected UnitedNations mediator;

 private String name;

 public Country(UnitedNations mediator, String name) {
  this.mediator = mediator;
  this.name = name;
 }

 public String getName() {
  return name;
 }

 protected abstract void declare(String msg);

 protected abstract void receive(String msg);
}

--------------------------------------------------------------------------------

ConcreteColleague

具体同事类:
 •每一个同事类都知道它的中介者对象.
 •每一个同事对象在需与其他同事通信时, 与它的中介者通信.

class USA extends Country {

 public USA(UnitedNations mediator, String name) {
  super(mediator, name);
 }

 @Override
 public void declare(String msg) {
  mediator.declare(this, msg);
 }

 @Override
 public void receive(String msg) {
  System.out.println("美国接收到: [" + msg + "]");
 }
}

class Iraq extends Country {

 public Iraq(UnitedNations mediator, String name) {
  super(mediator, name);
 }

 @Override
 public void declare(String msg) {
  mediator.declare(this, msg);
 }

 @Override
 public void receive(String msg) {
  System.out.println("伊拉克接收到: [" + msg + "]");
 }
}

class China extends Country {

 public China(UnitedNations mediator, String name) {
  super(mediator, name);
 }

 @Override
 public void declare(String msg) {
  mediator.declare(this, msg);
 }

 @Override
 public void receive(String msg) {
  System.out.println("中国接收到: [" + msg + "]");
 }
}

--------------------------------------------------------------------------------

Mediator

抽象中介者: 定义一个接口用于与各同事对象通信:

public abstract class UnitedNations {

 protected List<Country> countries = new LinkedList<>();

 public void register(Country country) {
  countries.add(country);
 }

 public void remove(Country country) {
  countries.remove(country);
 }

 protected abstract void declare(Country country, String msg);
}

--------------------------------------------------------------------------------

ConcreteMediator

具体中介者:
•了解并维护它的各个同事;
 •通过协调各同事对象实现协作行为(从同事接收消息, 向具体同事发出命令).

class UnitedNationsSecurityCouncil extends UnitedNations {

 /**
  * 安理会在中间作出调停
  *
  * @param country
  * @param msg
  */
 @Override
 protected void declare(Country country, String msg) {
  for (Country toCountry : countries) {
   if (!toCountry.equals(country)) {
    String name = country.getName();
    toCountry.receive(name + "平和的说: " + msg);
   }
  }
 }
}

如果不存在扩展情况, 那么Mediator可与ConcreteMediator合二为一.
 •Client

public class Client {

 @Test
 public void client() {
  UnitedNations mediator = new UnitedNationsSecurityCouncil();

  Country usa = new USA(mediator, "美国");
  Country china = new China(mediator, "中国");
  Country iraq = new Iraq(mediator, "伊拉克");

  mediator.register(usa);
  mediator.register(china);
  mediator.register(iraq);

  usa.declare("我要打伊拉克, 谁管我跟谁急!!!");
  System.out.println("----------");
  china.declare("我们强烈谴责!!!");
  System.out.println("----------");
  iraq.declare("来呀, 来互相伤害呀!!!");
 }
}

--------------------------------------------------------------------------------

 小结

Mediator的出现减少了各Colleague之间的耦合, 使得可以独立改变和复用各Colleague和Mediator, 由于把对象如何协作进行了抽象、将中介作为一个独立的概念并将其封装在一个对象中, 这样关注的焦点就从对象各自本身的行为转移到它们之间的交互上来, 从而可以站在一个更宏观的角度去看待系统.

 •适用性
中介者模式很容易在系统中应用, 也很容易在系统中误用. 当系统出现了“多对多”交互复杂的对象群时, 不要急于使用中介者, 最好首先先反思系统的设计是否是合理. 由于ConcreteMediator控制了集中化, 于是就把交互复杂性变成了中介者的复杂性, 使得中介者变得比任一个ConcreteColleague都复杂. 在下列情况下建议使用中介者模式:
◦一组对象以定义良好但复杂的方式进行通信. 产生的相互依赖关系结构混乱且难以理解.
 ◦一个对象引用其他很多对象并且直接与这些对象通信, 导致难以复用该对象.
 ◦想定制一个分布在多个类中的行为, 而又不想生成太多的子类.

•相关模式
◦Facade与中介者的不同之处在于它是对一个对象子系统进行抽象, 从而提供了一个更为方便的接口, 它的协议是单向的, 即Facade对象对这个子系统类提出请求, 但反之则不可. 相反, Mediator提供了各Colleague对象不支持或不能支持的协作行为, 而且协议是多向的.
 ◦Colleague可使用Observer模式与Mediator通信.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 设计模式之中介者模式_动力节点Java学院整理

    定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 类图: 中介者模式的结构 中介者模式又称为调停者模式,从类图中看,共分为3部分: 抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.一般包括一个或几个抽象的事件方法,并由子类去实现. 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法.从一个同事类接收消息,然后通过消息影响其他同时类. 同事类:如果一个对象会

  • 轻松掌握java中介者模式

    定义:用来降低多个对象和类之间的通信复杂性.中介者模式属于行为型模式. 特点: 1.降低了类的复杂度,将一对多转化成了一对一. 2.各个类之间的解耦. 3.符合迪米特原则. 企业级开发和常用框架中的应用:mvc模式中的c 具体实例: public class Demo { public static void main(String[] args) { Mediator m = new Mediator(); Department d1 = new Department(m, "开发部"

  • 详解Java设计模式编程中的中介者模式

    定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 类图: 中介者模式的结构        中介者模式又称为调停者模式,从类图中看,共分为3部分:  抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.一般包括一个或几个抽象的事件方法,并由子类去实现. 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法.从一个同事类接收消息,然后通过消息影响其他同时类. 同事类

  • Java设计模式之中介者模式(Mediator Pattern)简介

    Java设计模式的中介者模式是行为模式之一.定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显式地相互引用,从而使其耦合性松散,并且可以独立地改变他们之间的交互. 如下图所示: 生产者.消费者.代理商之间的中介模式实例: public abstract class PersonColleague { protected Mediator mediator; public Mediator getMediator() { return mediator; } public void

  • java设计模式之中介者模式

    中介者模式 面向对象设计鼓励将行为分布到各个对象中, 这种分布可能会导致对象间有许多连接. 在最坏的情况下, 每一个对象都需要知道其他所有对象. 虽然将一个系统分割成许多对象可增强可复用性, 但是对象间相互连接的激增又会降低其可复用性. 大量的连接关系使得一个对象不可能在没有其他对象的协助下工作(系统表现为一个不可分割的整体), 此时再对系统行为进行任何较大改动就十分困难. 因为行为被分布在许多对象中, 结果是不得不定义很多子类以定制系统的行为. 由此我们引入了中介者对象Mediator: 通过

  • 深入理解Java设计模式之中介者模式

    目录 一.什么是中介者模式 二.中介者模式的结构 三.中介者模式的优缺点 四.中介者模式的使用场景 五.中介者模式与发布/订阅模式的异同 六.中介者模式的实现 结果 总结 一.什么是中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者作为一种行为设计模式,它公开一个统一的接口,系统的不同对象或组件可以通过该接口进行通信.增加一个中介者对象后,所有的相关对象通过中介者对象来通信,而不是互相引用,所以当一个

  • java 设计模式之State(状态模式)

    java 设计模式之State(状态模式) 在状态模式中,一个类的行为基于它的状态的改变而改变.状态模式归属于行为型模式. 在下面的实例中,我们创建了一个接口State,定义了一个操作方法,两个实现类StartState和StopState.另外,创建了一个上下文类Context,这个类关联到State类.UML类图如下所示: //状态类 public interface State { public void doAction(Context context); } //实现类StartSta

  • Java设计模式之工厂方法模式实例简析

    本文实例讲述了Java设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式使用的频率非常高,在我们日常的开发中总能遇见到它的身影.其定义为:Define an interface for creating an object, but let subclass decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口

  • Java设计模式之抽象工厂模式实例详解

    本文实例讲述了Java设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 具体工厂类:生产创建某一类具体产品对象. 抽象产品类可以使用接口或者父类来描述产品对象的行为特征. 具体产品类就是某一具体的对象. 那么抽象工厂模式和工厂模式的不同之处呢? 其实最大的不同就在于,在产品类的结构更加复杂时,抽象工厂模式针对不同的产品族(就是一类产品对象)定义了不同的行为,也就是在父类或接口中,定义了不同的产生方法.不同的产品族调用各自的创建方法.同时不同的产品族横向比较,也有可归类的相同特征,这些特征

  • Java设计模式之静态工厂模式详解

    本文实例讲述了Java设计模式之静态工厂模式.分享给大家供大家参考,具体如下: 静态工厂模式(static factory)也叫简单工厂模式. 涉及到3个角色:工厂类角色,抽象产品类角色和具体产品类角色. 抽象产品类可以使用接口或者父类来描述产品对象的行为特征. 具体产品类就是某一具体的对象. 静态工厂类有一个静态的方法,含有判断逻辑,决定要创建哪一种具体的产品对象. 其设计模式如下: 抽象产品类  IProduct package org.test.design.sf; public inte

  • 快速理解Java设计模式中的组合模式

    组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系. 个人理解:组合模式就是将部分组装成整体. 定义如下: 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通用类图如下: 组合模式的包含角色: ● Component 抽象构件角色 定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性. ● Leaf 叶子构件 叶子对象,其下再也没有其他的分支,也就是遍历的最

  • Android编程设计模式之中介者模式详解

    本文实例讲述了Android编程设计模式之中介者模式.分享给大家供大家参考,具体如下: 一.介绍 中介者模式(Mediator Pattern)也称为调解者模式或调停者模式,Mediator本身就有调停者和调解者的意思. 在日常生活中调停者或调解者这个角色我们见得比较多的是"和事老",也就是说调解两个有争端的人的角色,举个不恰当的例子,比如爸妈吵架,孩子或者双方父母则会出面劝架或阻止争吵,这里孩子或双方父母则是充当的是调解者的模式. 而对于中介呢?大家平时听得最多的莫过于房产中介了,在

  • Java设计模式之抽象工厂模式

    一.场景描述 接<Java设计模式(一)工厂模式> 工厂模式有一缺点,就是破坏了类的封闭性原则.例如,如果需要增加Word文件的数据采集,此时按以下步骤操作: 创建Word文件数据采集类,实现仪器数据采集接口: 修改仪器数据采集工厂类,增加Word文件数据采集类的工厂方法: 调用工厂类的word文件方法: 步骤2修改了工厂类,如果每增加一实现类都需要修改工厂类,那么这样就不合理了. 解决办法是使用抽象工厂类,为每一个实现类都创建其工厂类,并增加工厂接口,使各工厂类实现该接口. 使用抽象工厂后,

随机推荐