定义:

用一个中介对象来封装以系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地变化他们之间的交互。

结构:(书中图,侵删)

一个抽象中介者
若干具体中介者
一个抽象同事类
若干个具体同事类

实例:

我觉得git就相当于一个中介者,用户之间不用互相认识,但是可以互相改代码。
 
抽象中介接口:
package designpattern.mediator;

public interface Mediator {
public void commit(String memo, User sender);
}

用户类(抽象同事类):

package designpattern.mediator;

public abstract class User {
protected Mediator mediator; public User(Mediator mediator) {
this.mediator = mediator;
}
}

仓库所有者类(具体同事类):

package designpattern.mediator;

public class Owner extends User {
public Owner(Mediator mediator) {
super(mediator);
} public void commit(String memo) {
mediator.commit(memo, this);
} public void receive(String memo) {
System.out.println("所有者收到信息:" + memo);
}
}

开发者类(具体同事类):

package designpattern.mediator;

public class Developer extends User {

    public Developer(Mediator mediator) {
super(mediator);
} public void commit(String memo) {
mediator.commit(memo, this);
} public void receive(String memo) {
System.out.println("开发者收到信息:" + memo);
}
}

GitHub类(具体中介者类):

package designpattern.mediator;

public class GitHub implements Mediator {
Owner owner;
Developer developer; public void setOwner(Owner owner) {
this.owner = owner;
} public void setDeveloper(Developer developer) {
this.developer = developer;
} @Override
public void commit(String memo, User sender) {
if (sender == owner) {
developer.receive(memo);
} else {
owner.receive(memo);
}
} }

客户端:

package designpattern.mediator;

public class Client {
public static void main(String[] args) {
GitHub gitHub = new GitHub();
Owner owner = new Owner(gitHub);
Developer developer = new Developer(gitHub);
gitHub.setOwner(owner);
gitHub.setDeveloper(developer); owner.commit("我新建了一个项目");
developer.commit("我帮你改了一个BUG");
} }

结果输出:

开发者收到信息:我新建了一个项目
所有者收到信息:我帮你改了一个BUG

总结:

虽然解耦了同事类,但他们和中介类的耦合挺紧密的,并且每新增一个类,中介类都要相应修改。对于复杂系统来说,中介类会过于的复杂。
所以要谨慎使用这个模式。
书中提到的适用场景:
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合(比如一个程序窗体(中介者)之于其中的各种组件(按钮、菜单、显示框等同事类))
以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

设计模式 | 中介者模式/调停者模式(Mediator)的更多相关文章

  1. 设计模式——中介者模式/调停者模式(C++实现)

    #include <iostream> #include <string> using namespace std; class Colleague; class Mediat ...

  2. java设计模式9.备忘录模式、访问者模式、调停者模式

    备忘录模式 备忘录模式又叫快照模式,备忘录对象是一个用来存储另外一个对象内部状态快照的对象.备忘录的用意是在不破坏封装的条件下,将一个对象的状态捕捉,并外部化存储起来,从而可以在将来合适的时候把这个对 ...

  3. 中介者模式 调停者 Mediator 行为型 设计模式(二十一)

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

  4. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

  5. [工作中的设计模式]中介模式模式Mediator

    一.模式解析 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介模式又叫调停者模式,他有如下特点: 1.有多个系统或者对 ...

  6. 24种设计模式--中介者模式【Mediator Pattern】

    各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...

  7. 调停者模式Mediator(中介者模式)详解

    原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  8. 《Java设计模式》之调停者模式(Mediator)

    调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从而使它们能够较松散地耦合.当这些对象中的某些对象之间的相互作用发生改变时,不会马上影响到其它的一些 ...

  9. javascript设计模式--中介者模式(Mediator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Java设计模式之《调停者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6518603.html 调停者模式. 我们想象一下这样的场景:一个系统内部通过许多的类互相之 ...

随机推荐

  1. 一个JVM参数,服务超时率降了四分之三

    先说结论:通过优化Xms,改为和Xmx一致,使系统的超时率降了四分之三 1. 背景 一个同事说他负责的服务在一次上线之后超时率增加了一倍 2. 分析 2.1 机器的监控 首先找了一台机器,看了监控 上 ...

  2. 你真的了解Java内存模型JMM吗?

    哈喽,大家好,我是世杰. 本文我为大家介绍面试官经常考察的「Java内存模型JMM相关内容」 面试连环call 什么是Java内存模型(JMM)? 为什么需要JMM? Java线程的工作内存和主内存各 ...

  3. Java Executors类的9种创建线程池的方法及应用场景分析

    在Java中,Executors 类提供了多种静态工厂方法来创建不同类型的线程池.在学习线程池的过程中,一定避不开Executors类,掌握这个类的使用.原理.使用场景,对于实际项目开发时,运用自如, ...

  4. 洛谷P1020

    又是一道做的很麻的题,准确来说感觉这不是一道很好的dfs题,没有体现dfs的一些特点 反而感觉是在考察dp,刚开始也是按照我的思路交了3次都没过 原本以为所选的数应该都是由上一次的最大值推出来的,后面 ...

  5. 英特尔开源新等宽字体Intel One Mono,称可保护开发者视力

    英特尔开源了一款面向开发者的新等宽字体 "Intel One Mono ",这是一种富有表现力的等宽字体系列,集清晰度.易读性和开发者视力保护于一体. Intel One Mono ...

  6. jwt redis,微信登陆知识复习 uniapp 请求封装,统一异常处理 相关, HutoolDemo工具介绍)

    第三节   后台布局搭建,代码可以人工智能来写,但是环境初步搭建需要我们先建起来,所以以下记录快带搭建的过程, 思路: 后台首页的搭建 第一   用到了element--UI 自带的页面布局组件,它就 ...

  7. RHCA rh442 005 (NICE FIFO RR) 资源强占与分配 cpuset

    cgroup 容器 控制服务访问 limits 控制用户 进程管理 [root@servera ~]# ps -aux | more USER PID %CPU %MEM VSZ RSS TTY ST ...

  8. WPF MVVM模式简介

    WPF是Windows Presentation Foundation的缩写,它是一种用于创建桌面应用程序的用户界面框架.WPF支持多种开发模式,其中一种叫做MVVM(Model-View-ViewM ...

  9. 14、SpringMVC之注解配置

    14.1.概述 在实际工作中,一般使用配置类和注解代替web.xml和SpringMVC配置文件的功能: 在 Servlet3.0 环境中,容器会在类路径中查找实现了 javax.servlet.Se ...

  10. 【爬虫】Python获取星巴克所有产品

    视频只介绍了BS4的简单使用,但我想全部获取出来 其实翻看接口,直接有一个json资源提供了这些数据,但是没有分类 import re import urllib.request from bs4 i ...