一、中介者模式概述

  如果一个系统中对象之间的联系呈现网状结构,对象之间存在大量多对多的关系,导致关系及其复杂,这时可以引入一个中介者对象,使得各个对象只跟中介者对象打交道,从而将复杂的网络结构化为星型结构。

  核心:

    (1)如果一个系统中对象之间的联系呈现网状结构,对象之间存在大量的多对多关系,将导致关系及其复杂,这些对象称为“同事对象”;

    (2)这时可以引入一个中介者对象,使各个同事对象只跟中介只对象打交道,将复杂的网络结构化解为星型结构。

  

二、中介者模式情景导入

  在一个公司里边,有三个部门:财务部、市场部、研发部。假如没有总经理时,财务部给员工发工资,需要和其他两个部门打交道,市场部也要和其他两个部门打交道,研发部接收市场部需求,并且需要财务部资金支持,所有也要和其他两个部门打交道。虽然只有三个部门,但是关系却非常混乱。

  实际上,每个公司都有总经理,各个部门需要和其他部门打交道时先通报总经理,总经理再通知各个相关部门,这样,关系就简单的多了。

  这是一个典型的“中介者模式”,总经理起到中介、协调的作用。

三、中介者模式示例代码

 /**
* 部门的接口
* @author CL
*
*/
public interface Department {
/**
* 自己的工作
*/
void selfAction();
/**
* 对外的工作(向总经理发出申请)
*/
void outAction();
}
 /**
* 财务部
* @author CL
*
*/
public class Financial implements Department {
/**
* 持有中介者(总经理)的引用
*/
private Mediator m; public Financial(Mediator m) {
this.m = m;
m.register("财务部", this);
} @Override
public void selfAction() {
System.out.println("财务部本职工作-->做账!提供资金支持!");
} @Override
public void outAction() {
System.out.println("财务部对外工作-->汇报工作!收卖产品的钱!");
m.command("市场部");
} }
 /**
* 市场部
* @author CL
*
*/
public class Market implements Department {
/**
* 持有中介者(总经理)的引用
*/
private Mediator m; public Market(Mediator m) {
this.m = m;
m.register("市场部", this);
} @Override
public void selfAction() {
System.out.println("市场部本职工作-->跑业务!卖产品!");
} @Override
public void outAction() {
System.out.println("市场部对外工作-->汇报工作!申请资金支持!");
m.command("财务部");
} }
 /**
* 研发部
* @author CL
*
*/
public class Development implements Department {
/**
* 持有中介者(总经理)的引用
*/
private Mediator m; public Development(Mediator m) {
this.m = m;
m.register("研发部", this);
} @Override
public void selfAction() {
System.out.println("研发部本职工作-->研发产品!");
} @Override
public void outAction() {
System.out.println("研发部对外工作-->汇报工作!寻找资金支持!");
m.command("财务部");
} }
 /**
* 中介者的接口(总经理)
* @author CL
*
*/
public interface Mediator {
/**
* 各部门向总经理备案
* @param dName 部门名称
* @param d 部门
*/
void register(String dName, Department d); /**
* 向其他部门发送任务
* @param dName 部门名称
*/
void command(String dName);
}
 import java.util.HashMap;
import java.util.Map; /**
* 总经理类(中介)
* @author CL
*
*/
public class President implements Mediator {
private Map<String, Department> map; public President() {
map = new HashMap<String, Department>();
} @Override
public void register(String dName, Department d) {
map.put(dName, d);
} @Override
public void command(String dName) {
map.get(dName).selfAction();
} }

  测试:

 /**
* 测试中介者模式
* @author CL
*
*/
public class Client { public static void main(String[] args) {
Mediator m = new President(); //各部门向总经理备案
Market market = new Market(m);
Financial financial = new Financial(m);
Development development = new Development(m); //市场部
market.selfAction();
market.outAction(); System.out.println("-------------------------------"); //财务部
financial.outAction(); System.out.println("-------------------------------"); //研发部
development.outAction(); }
}

  控制台输出:

市场部本职工作-->跑业务!卖产品!
市场部对外工作-->汇报工作!申请资金支持!
财务部本职工作-->做账!提供资金支持!
-------------------------------
财务部对外工作-->汇报工作!收卖产品的钱!
市场部本职工作-->跑业务!卖产品!
-------------------------------
研发部对外工作-->汇报工作!寻找资金支持!
财务部本职工作-->做账!提供资金支持!

四、中介者模式常见开发应用场景

  (1)MVC 模式(其中 C 控制器就是一个中介者对象,M 和 V 都和 C 打交道);

  (2)窗口游戏游戏,窗口软件开发中窗口对象也是一个中介者对象;

  (3)图形界面开发 GUI 中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者 DOM对象;

  (4)…………

GOF23设计模式之中介者模式(mediator)的更多相关文章

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  3. 【GOF23设计模式】中介者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...

  4. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  6. 大熊君说说JS与设计模式之------中介者模式Mediator

    一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...

  7. 设计模式 笔记 中介者模式 Mediator

    //---------------------------15/04/27---------------------------- //Mediator 中介者模式----对象行为型模式 /* 1:意 ...

  8. 行为型设计模式之中介者模式(Mediator)

    结构 意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性 一组对象以定义良好但是复杂的方式进行通信.产生的相互 ...

  9. 【设计模式】—— 中介者模式Mediator

    前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用 ...

随机推荐

  1. centos7 iptables替换firewall

    Disable Firewalld Service. [root@rhel-centos7-tejas-barot-linux ~]# systemctl mask firewalld Stop Fi ...

  2. Linq的使用 <一>

    一.种类 1.Linq to Objects,实现了IEnumerable<T>集合对象的集成查询 2.Linq to sql,针对关系数据库MSSQL的解释查询 3.Linq to En ...

  3. rsync配置文件的参数详解

    rsyncd.conf配置文件常用参数说明: rsyncd.conf参数 参数说明 uid=rsync rsync使用的用户. gid=rsync rsync使用的用户组(用户所在的组) use ch ...

  4. 记录一个bootstrap因js加载顺序导致的问题(tstrap-table-mobile.min.js:7 Uncaught TypeError: Cannot read property 'defaults' of undefined)

    问题描述: 网上找了会没看到答案,然后看了下源码,发现也没有问题,想到js加载的顺序,改了下,发现问题没了. 正确的顺序: 我之前把 <script src="/js/plugins/ ...

  5. Python中的数据结构 --- 列表(list)

      列表(list)是Python中最基本的.最常用的数据结构(相当于C语言中的数组,与C语言不同的是:列表可以存储任意数据类型的数据). 列表中的每一个元素分配一个索引号,且索引的下标是从0开始. ...

  6. tomcat是否有必要配置环境变量

    之前发表了一篇关于如何安装和配置Tomcat的文章,而最近在开发项目的时候总是报错.后来被公司的大神问了一句:是谁告诉你Tomcat是需要配置环境变量的? 作为新手的我瞬间整个人都不好了!于是偷偷百度 ...

  7. Linux运维-Rsync+Inotify

      Rsync+Inotify Rsync:linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. 特性: 可 ...

  8. 汇编语言---键盘KeyCode值列表

    键盘KeyCode值列表 收藏 keycode   0 =keycode   1 =keycode   2 =keycode   3 =keycode   4 =keycode   5 =keycod ...

  9. Hello Pythoner!

    首先,欢迎你来到pyer的博客,希望你能有所收获! 然后,pyer之前学C#(原博客地址:初行-博客园),后来转的Python,目前从事服务端研发工作. 最后,相逢便是缘,如果看过pyer的博客后有什 ...

  10. hihocoder1618 单词接龙

    #1618 : 单词接龙 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个单词字典和一个起始字母.小Hi需要从起始字母开始,每次再加上一个字母,生成长度为2.3. ...