Mediator 中介者 协调者模式
简介
定义:用一个【中介者对象】封装一系列的【对象交互】,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。中介者模式的结构
- 抽象中介者Mediator:定义好【同事类对象】到【中介者对象】的接口,用于各个【同事类之间】的通信。在里面定义了各个同事之间相互交互所需要的方法
- 具体中介者ConcreteMediator:实现抽象中介者中定义的方法,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系
- 同事类Colleague:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类;在实际应用中,同事类可能由多个组成,他们之间相互影响,相互依赖;同事类也可以表现为继承了同一个抽象类的一组实现组成;在中介者模式中,同事类之间必须通过中介者才能进行消息传递。
- 具体同事类ConcreteColleague:实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。
中介者模式的优点
- 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用
- 降低了系统对象之间的耦合性,使得对象易于独立的被复用
- 提高系统的灵活性,使得系统易于扩展和维护
- 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护
- 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用
适用场景
- 在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。
- 一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。
- 使用中介者模式,可以将网状结构变为星状结构(星状结构的中心当然是中介者啦),使同事类之间的关系变的清晰一些。
- 中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。
通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。java.util.Timerjava.util.concurrent.Executor#execute()java.util.concurrent.ExecutorService#submit()java.lang.reflect.Method#invoke()
演示
/**抽象同事类Colleague,同事类之间必须通过中介者才能进行消息传递*/public abstract class Colleage {protected String name;protected Mediator mediator;Colleage(String name, Mediator mediator) {this.name = name;this.mediator = mediator;}/**与中介者联系*/public abstract void constact(String message);/**获取信息 */public abstract void getMessage(String message);}//房东,具体同事类******************************************************************************************class HouseOwner extends Colleage {HouseOwner(String name, Mediator mediator) {super(name, mediator);}@Overridepublic void constact(String message) {mediator.constact(message, this);//需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互}@Overridepublic void getMessage(String message) {System.out.println("房主" + name + "收到中介发的消息:\n " + message);}}//房客******************************************************************************************class Tenant extends Colleage {Tenant(String name, Mediator mediator) {super(name, mediator);}/**与中介者联系*/@Overridepublic void constact(String message) {mediator.constact(message, this);}/**获取信息*/@Overridepublic void getMessage(String message) {System.out.println("租房者" + name + "收到中介发的消息:\n " + message);}}/**抽象中介者,定义好【同事类对象】到【中介者对象】的接口,用于各个【同事类之间】的通信。在里面定义了各个同事之间相互交互所需要的方法 */public abstract class Mediator {/**申明一个房东和租客之间联络的方法*/public abstract void constact(String message, Colleage colleage);}/**具体中介者,实现抽象中介者中定义的方法,它需要维护每个同事对象,并负责具体的协调各个同事对象的交互关系*/class MediatorStructure extends Mediator {private HouseOwner houseOwner; //中介者必须知道房主和租房者的信息private Tenant tenant;public HouseOwner getHouseOwner() {return houseOwner;}public void setHouseOwner(HouseOwner houseOwner) {this.houseOwner = houseOwner;}public Tenant getTenant() {return tenant;}public void setTenant(Tenant tenant) {this.tenant = tenant;}@Overridepublic void constact(String message, Colleage colleage) {if (colleage == houseOwner) tenant.getMessage("你好,我是中介,我收到房东" + tenant.name + "的出租消息,内容为【" + message + "】");else houseOwner.getMessage("你好,我是中介,我收到房客" + colleage.name + "的求租消息,内容为【" + message + "】");}}public class Test {public static void main(String[] args) {//一个房主、一个租房者、一个中介机构MediatorStructure mediator = new MediatorStructure();//房主和租房者只需要知道中介机构即可HouseOwner houseOwner = new HouseOwner("煞笔", mediator);Tenant tenant = new Tenant("包青天", mediator);//中介结构要知道房主和租房者mediator.setHouseOwner(houseOwner);mediator.setTenant(tenant);tenant.constact("黑中介你好,请问你那里有没有二室一厅的房要出租?");houseOwner.constact("有的,房租只要8000一月,很便宜吧!");tenant.constact("滚粗");houseOwner.constact("呵呵,还有一间一室一厅的房子,只要200块,要租不?");tenant.constact("滚蛋");}}
附件列表
Mediator 中介者 协调者模式的更多相关文章
- C++设计模式-Mediator中介者模式
Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...
- 设计模式 ( 十六 ): Mediator中介者模式 -- 行为型
1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象 ...
- 设计模式16:Mediator 中介者模式(行为型模式)
Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...
- Mediator(中介者)-对象行为型模式
1.意图 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 2.动机 通过将集体行为封装在一个单独的中介者对象中,中介者 ...
- 设计模式学习之中介者模式(Mediator,行为型模式)(18)
转载地址:http://www.cnblogs.com/zhili/p/MediatorPattern.html 一.引言 在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信 ...
- 设计模式(17)--Mediator(中介者模式)行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以 ...
- Mediator - 中介者模式
定义 用一个中介对象来封装一系列的对象的交互.中介者使各对象不须要显示地相互使用,从而使其耦合松散,并且能够独立的改变他们之间的交互. 案例 比方有一个图像界面,在界面上有一个输入框LineEdit, ...
- 设计模式学习笔记——Mediator中介者模式
将众多对象之间的网状关系转为全部通过一个中间对象间接发生关系,此中间对象为中介者. 看图最直观: 作用不言而喻,就是降低对象之间的耦合度,乃至降低了整个系统的复杂度. 有点象代理模式,更象外观模式:
- Mediator 中介者 MD
中介者模式 简介 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介者模式也称为调解者模式或者调停者模式. 当程序存在大 ...
随机推荐
- Apache:To Config The Vhost of Django Project
It is not a good idea to use dev server in Production Environment. Apache or Nginx are good choice.B ...
- jquery如何判断div是否隐藏--useful
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- code first基础
随着.NET 4.0时代的到来,开发者越来越关注如何能加快开发效率,从而构建健壮的程序.而微软在.NET 4.0推出的Entity Framework,无疑是值得开发者去学习的,它实际上是微软的ADO ...
- 【Java】理解 UDDI
跟上规范的不断发展 统一描述.发现和集成(Universal Description, Discovery, and Integration,UDDI)项目继续丰富企业用于在 UDDI 业务注册中心表 ...
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条
Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...
- JSP出现中文乱码问题
今天纠结了好半天,本地运行程序后没有中文乱码,唯独发到服务器后运行出现了乱码. 究其原因,皆因eclipse环境默认的JSP编码是Iso-8859-1,需要将其改为utf-8,与JSP文件中的编码声明 ...
- Building a Space Station(kruskal,说好的数论呢)
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3820 Accepted: 1950 Description You a ...
- Linux企业级开发技术(3)——epoll企业级开发之epoll模型
EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据. Level Triggered (LT) 水平触发 只要有数据都会触 ...
- iOS应用架构浅谈
(整理至http://www.cocoachina.com/ios/20150414/11557.html) 缘由 从事iOS工作一年多了,主要从事QQ钱包SDK开发和财付通app维护,随着对业务的慢 ...
- unicode编码、字符的转换和得到汉字的区位码
一:unicode编码.字符的转换截图 二:unicode编码.字符的转换代码 using System; using System.Collections.Generic; using System ...