【大话设计模式】模式十:中介者模式
【引入】
国与国之间的关系,类似于对象与对象之间的关系,这就要求对象之间需要知道其他所有对象。但是对象之间大量的链接使得一个对象不可能在没有其他对象支持下工作,系统表现为一个不可分割的整体,降低其可复用性。
这里提及一下 迪米特法则 (即两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用) 如果一个类要调用某个类的方法,可以通过第三方转发这个的调用。正如国与国之间,可以通过联合国这个中介者来发生相互通信。
一、中介者模式
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Colleague叫做抽象同事类;
public abstract class Colleague {private Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public Mediator getMediator() {return mediator;}public void setMediator(Mediator mediator) {this.mediator = mediator;}
}
ConcreteColleague是具体同事类,每个具体的同事只知道自己的行为,而不了解其他同事类的情况,但是它们却都认识中介者对象;
public class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}public void send(String message) {getMediator().send(message, this);}public void Notify(String message) {System.out.println("同事1收到消息:" + message);}
}public class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}public void send(String message) {getMediator().send(message, this);}public void Notify(String message) {System.out.println("同事2收到消息:" + message);}
}
Mediator是抽象中介者,定义了同事对象列表中介者对象的接口;
public abstract class Mediator {/*** 定义一个抽象的发送消息方法,得到同事对象和发送信息* @param message* @param colleague*/public abstract void send(String message,Colleague colleague);
}
ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有的具体同事类,并且从具体同事类接受消息,向具体同事类发出命令;
public class ConcreteMediator extends Mediator {private ConcreteColleague1 colleague1;private ConcreteColleague2 colleague2;public void setColleague1(ConcreteColleague1 colleague1) {this.colleague1 = colleague1;}public void setColleague2(ConcreteColleague2 colleague2) {this.colleague2 = colleague2;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleague1) {colleague2.Notify(message);} else {colleague1.Notify(message);}}
}
客户端类
public class Client {public static void main(String[] args) {ConcreteMediator mediator=new ConcreteMediator();ConcreteColleague1 colleague1=new ConcreteColleague1(mediator);ConcreteColleague2 colleague2=new ConcreteColleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.send("早上好啊!");colleague2.send("早安!");}
}
二、中介者模式应用
美国和伊拉克之间的对话都是通过联合国安理会作为中介来完成。
UML类图:
UniteNations (联合国机构类) 相当于Mediator类
/*** 联合国机构*/
public abstract class UniteNations {//声明public abstract void declare(String message,Country colleague);
}
国家类 相当于Colleague类
/*** 国家*/
public abstract class Country {protected UniteNations mediator;public Country(UniteNations mediator) {this.mediator = mediator;}
}
美国类 相当于ConcreteColleague1类
public class USA extends Country {public USA(UniteNations mediator) {super(mediator);}//声明public void declare(String message) {mediator.declare(message, this);}//获得消息public void getMessage(String message) {System.out.println("美国获得对方信息:" + message);}
}
伊拉克类 相当于ConcreteColleague2类
public class Iraq extends Country {public Iraq(UniteNations mediator) {super(mediator);}//声明public void declare(String message) {mediator.declare(message, this);}//获得消息public void getMessage(String message) {System.out.println("伊拉克获得消息:" + message);}
}
联合国安理会 相当于ConcreteMediator类
public class UnitedNationSecurityCouncil extends UniteNations {private USA colleague1;private Iraq colleague2;public void setColleague2(Iraq colleague2) {this.colleague2 = colleague2;}public void setColleague1(USA colleague1) {this.colleague1 = colleague1;}@Overridepublic void declare(String message, Country colleague) {if (colleague == colleague1) {colleague2.getMessage(message);} else {colleague1.getMessage(message);}}
}
客户端类
public class Client {public static void main(String[] args) {UnitedNationSecurityCouncil UNSC=new UnitedNationSecurityCouncil();USA colleague1=new USA(UNSC);Iraq colleague2=new Iraq(UNSC);UNSC.setColleague1(colleague1);UNSC.setColleague2(colleague2);colleague1.declare("伊拉克你们不准研制核武器,否则我们将发动战争!");colleague2.declare("我们没有核武器,但是我们不怕战争!");}
}
优点:
- 降低了类的复杂度,将一对多转化成了一对一。
- 各个类之间的解耦。
- 符合迪米特原则。
缺点:
- 中介者会庞大,变得复杂难以维护。
使用场景:
- 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项:不应当在职责混乱的时候使用。
【大话设计模式】模式十:中介者模式相关推荐
- 设计模式学习笔记--中介者模式(详细笔记)
文章目录 1. 概述 2. 使用实例 1. 概述 使用背景: 菜鸟教程 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. ...
- Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式
Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...
- 云计算设计模式(十)——守门员模式
云计算设计模式(十)--守门员模式 通过使用充当客户端和应用程序或服务之间的代理,验证和进行消毒的请求,并将它们之间的请求和数据的专用主机实例保护的应用程序和服务.这可以提供一个额外的安全层,并限制了 ...
- Java23种设计模式——19.行为型模式之中介者模式
Java中除去有设计原则之外,还有23中设计模式. 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题. 并且在这些模式中,可以说是将语言的使用体现的淋 ...
- 【Java开发】设计模式 17:中介者模式
1 中介者模式介绍 中介者模式是一种行为设计模式,指用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.在这个模式中,中介者 ...
- java设计模式-观察者模式和中介者模式的异同
1.基本定义区别: 观察者模式: :察者模式属于行为型模式,指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模 ...
- 行为型模式:中介者模式
LieBrother公众号原文: 行为型模式:中介者模式 十一大行为型模式之二:中介者模式. 简介 姓名 :中介者模式 英文名 :Mediator Pattern 价值观 :让你体验中介是无所不能的存 ...
- 行为型模式:中介者模式 1
前方高能:<一故事一设计模式>PDF 电子书已经上线,关注公众号即可获取. LieBrother公众号原文: 行为型模式:中介者模式 十一大行为型模式之二:中介者模式. 简介 姓名 :中介 ...
- java mediator模式_中介者模式(Mediator)
中介者模式 一. 中介者模式 1.1 定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互. 1.2 角色 抽象中介者类(A ...
- Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)
Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...
最新文章
- usaco Money system
- 如何使用 Laravel Collections 类编写神级代码
- java使用Crawler4j开发爬虫
- SpringBoot入门:新一代Java模板引擎Thymeleaf(理论)
- 谈身份管理之基础篇 - 保障云上安全,从[规范账号使用]开始
- python findcontours_基于Python的opencv学习练习(十二) findContours()轮廓与绘制drawContours()...
- UVA 11107 Life Forms——(多字符串的最长公共子序列,后缀数组+LCP)
- wget 持续下载确保完成
- AndroidStudio修改布局文件运行无效
- 以前做过一个光标代码的梦,貌似也是个预言梦
- Ubuntu14.04环境编译vlc源码for安卓Android系统
- 遥感图像预处理—步骤
- linux服务器删除weblogic,linux weblogic安装和卸载
- 聚宽macd底背离_看图学大级别MACD底背离
- 情感计算机具体应用领域,人工智能-情感计算
- 浮点数开方运算的快速计算
- 低成本的电流检测电路
- es6 filter数组过滤方法
- 白帽子讲web安全之 浏览器安全
- 周师计算机专业学校分数线,周口师范学院是几本?录取分数线是多少