设计模式之第19章-中介者模式(Java实现)
设计模式之第19章-中介者模式(Java实现)
“测试妹纸找你,你的代码出问题了。”“美工妹纸让你看看界面怎么样。”身为程序员总要和各种人打交道,但是如果再分为前端、后端工程师的话,那么关系就会错综复杂起来了,这个时候如果有中介者进行中转,类似于星型网络拓扑的交换机,那么该有多好。(PS:注孤生啊,和测试妹纸、美工妹纸什么的一起讨论增进感情多好,那么好的机会都不珍惜。编者按:我是要做那个中介者,懂么?中介者!众人:good job!)“鱼哥,叫我干嘛?”真是说曹操曹操到,刚刚正说你来着,行了,你来说吧。
中介者模式之自我介绍
我乃传说中的中介者,又名“Mediator”,定义如下:Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.翻译为:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。通用类图如下:

中介者模式之自我分析
都说到这个份上了,自然也要简单的分析一下自己:
优势:
- 减少了子类的生成。这样各个Colleague类可以被重用。
- 将各个Colleague进行解耦。这样的话,就可以独立的改变和复用各种Colleague和Mediator类。
- 简化了对象协议。使得Mediator和各个Colleague一对多交互,把关系进行简化,有利于理解维护和扩展。
- 对对象如何协作进行了抽象,有助于理解一个系统中各个对象如何交互。
劣势:
- 使控制集中化,所以中介者会比较复杂,然后使得中介者变得难于维护。
中介者模式之实现
实现嘛,既然你们要看,那我就拿一个Team的个别部分做一个Demo吧。首先我有一个抽象同事类,要和你谈谈:
public abstract class AbstractColleague{
protected AbstractMediator mediator;
public AbstractColleague(AbstractMediator mediator){
this.mediator = mediator;
}
}
接下来就是程序员的具体实现类了,其中有三个方法,,两个是自己执行的方法,一个是美工妹纸的任务,通过中介者交给美工妹纸做:
public class Programmer extends AbstractColleague{
public Programmer(AbstractMediator mediator){
super(mediator);
}
//美工妹纸的任务,通过中介者交给美工
public void notifyifyUIer(){
System.out.println("告诉美工妹纸帮忙美化界面");
super.mediator.beautifyUI();
}
public void code(){
System.out.println("写程序,开发");
}
public void view(){
System.out.println("看看界面如何");
}
}
然后是美工妹纸的具体实现类,一个是自己的工作,一个是程序员的事儿,通过中介交给程序员:
public class UIer extends AbstractColleague{
public UIer(AbstractMediator mediator){
super(mediator);
}
//程序员的任务,通过中介者交给程序员
public void notifyProgrammer(){
System.out.println("让程序员看看界面");
super.mediator.view();
}
public void beautifyUI(){
System.out.println("美化界面");
}
}
接下来就是重头戏,压轴,也就是说抽象中介者抽象类的实现:
public abstract class AbstractMediator{
//程序员
protected Programmer programmer;
//UI妹纸
protected UIer ui;
//构造函数
//set、get方法,此处略去
//鱼哥用来处理多个对象间的关系
public abstract void beautifyUI();
public abstract void view();
}
最后是中介类的具体实现:
public class Mediator extends AbstractMediator{
//鱼哥的协调策略
public abstract void beautifyUI(){
super.ui.beautifyUI();
}
public abstract void view(){
super.programer.view();
}
}
到此,一个中介者模式就实现了。如果还有其他的相互关联的同事,如测试妹纸、市场、项目经理等等都可以加进去,由中介者进行关联。
中介者模式之应用场景
接下来我就介绍一下在哪些情况下,可以使用我:
- 一组对象以定义良好但是复杂的方式进行通信。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多子类。
当你在项目中遇到以上情况或者类似的情况时,可以使用我来进行对象间的通信,这样会把复杂的问题简单化~虽然对象过多的时候,会导致中介者过于庞大。恩,鱼哥,我讲完了。(PS:给大家说这句话。)哦,大家,我讲完了。(作者满头黑线的离开了、、、)
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第19章-中介者模式(Java实现)的更多相关文章
- 设计模式之第13章-职责链模式(Java实现)
设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...
- 设计模式之第12章-享元模式(Java实现)
设计模式之第12章-享元模式(Java实现) “怎么回事,竟然出现了OutOfMemory的错误.鱼哥,来帮我看看啊.”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊.对了,有 ...
- 设计模式之第2章-抽象工厂模式(Java实现)
设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...
- 设计模式之第1章-工厂方法模式(Java实现)
设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...
- 第17章 中介者模式(Mediator Pattern)
原文 第17章 中介者模式(Mediator Pattern) 中介者模式 概述: 在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进 ...
- Java 设计模式系列(十七)中介者模式
Java 设计模式系列(十七)中介者模式 用一个中介对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互 一.中介者模式结构 Media ...
- 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
概述: 假设我们开发一个图片处理软件,里面肯定包括很多相关功能,比如说剪切,旋转,滤镜,美化等等,而我们这些功能所要处理的对象是固定的,就是我们所显示的那张图片.但是我们不能把所有的功能罗列到一个ta ...
- C#设计模式学习笔记:(17)中介者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7966240.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第五个模式--中 ...
- javascript设计模式学习之十四——中介者模式
一.中介者模式的定义和应用场景 中介者模式的作用在于解除对象之间的紧耦合关系,增加一个中介者之后,所有对象都通过中介者来通信,而不是互相引用,当一个对象发生变化的时候,仅需要通知中介者即可.从而将网状 ...
随机推荐
- Android各大手机系统打开权限管理页面
最近项目上比较忙,终于有空闲时间写写东西了. 相信做过Android的都知道,现在的手机系统五花八门,当我们去请求用户的权限的时候,总是会弹出是否允许的对话框. 而且用户一旦不小心点了拒绝,下次就不再 ...
- CentOS下内核TCP参数优化配置详解
主动关闭的一方在发送最后一个ACK后就会进入TIME_WAIT状态,并停留2MSL(Max Segment LifeTime)时间,这个是TCP/IP必不可少的. TCP/IP的设计者如此设计,主要原 ...
- zabbix 监控项
监控项 概述 监控项是从主机收集的数据信息. 配置主机后,你需要添加一些监控项以开始获取实际数据. 一个监控项是一个独立的指标.快速添加多个监控项的一种方法是将一个预定义的模板附加到主机.然而,为了优 ...
- Yii2 components api/controller
When we wrote API, those controllers need to implement the following feature: 1. return JSON format ...
- 关于调用百度地图api在自己写的网页中实现和解决在https中正常显示
百度地图开发者:http://lbsyun.baidu.com/index.php?title=jspopular 我们打开百度地图开发者网站,注册一个百度账号,然后打开控制台,开始创建应用:(如果你 ...
- hiho一下 第三十八周 二分答案
题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...
- c++输入
1. char c = getchar(); 输入单个字符,可输入空格.换行符. 2. cin >> s; 不读取空格或换行符. 3. getline(cin, s); 输入一行到字符串s ...
- C++指针的概念解读
C++指针的概念解读 超详细 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区 ...
- 【BZOJ2730】[HNOI2012] 矿场搭建(找割点)
点此看题面 大致题意: 一张无向图,要求你在去掉任意一个节点之后,剩余的每个节点都能到达一个救援出口,问至少需要几个救援出口. 第一步:\(Tarjan\)求割点 首先,我们要跑一遍\(Tarjan\ ...
- Hybrid App开发之css样式使用
前言: 前面学习了html,今天学习一下css的基本使用,看下html与css之间是如何结合来编写前端网页的. CSS 是什么? CSS 是 Cascading Style Sheets(级联样式表) ...