Java 设计模式——中介者模式(行为型设计模式)

简介

中介者模式(Mediator Pattern),定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为,属于行为型模式。
其主要的目的是用来降低多个对象和类之间的通信复杂性。

简单的来说就是提供一个平台。比如生活中我们经常用到的聊天软件QQ、微信群,或者是上网购物的网站淘宝、京东,又或者是房产中介。但是无论是QQ群,还是房产中介,他们都是充当一个中间平台的作用,我们可以直接通过这个平台得到我们想要的信息,避免了独自获取花费的成本。

角色

中介者模式主要由这四个角色组成, 抽象中介者(Mediator)、具体中介者(ConcreteMediator)、 抽象同事类(Colleague)和具体同事类(ConcreteColleague) 。

  • 抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
  • 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从 具体的同事类那里接收信息,并且向具体的同事类发送信息。
  • 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
  • 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

示例图如下:
在这里插入图片描述

代码

这里为了方便理解,我们使用一个简单的示例来加以说明。
xuwujing创建了一个Java的QQ群,并邀请了很多人进来,其中张三也加进来了,进群之后,大家开始互相打招呼进行交流。。。
那么我们便可以根据这个简单的例子来使用中介者模式进行开发。
首先依旧定义一个抽象的中介者,就是QQ群,可以进行交流;然后再定义一个抽象的同事类,可以谈话。
那么这个抽象类的代码如下:


interface QQqun {
   void exchange(Person person,String message);
}

abstract class Person{
   protected String name;
   protected QQqun qun;  
   Person(String name,QQqun qun){
       this.name = name;
       this.qun = qun;
   }
}

定义好该抽象类之后,我们再来定义具体的同事类,也就是xuwujing和张三,可以进行交流。

那么代码如下:

class ZhangSan extends Person{

   ZhangSan(String name, QQqun qun) {
   	super(name, qun);
   }
   
    void exchange(String message){
   	qun.exchange(this,message);
   }
   
    void talk(String message){
       System.out.println(name +"说:" + message);
   }
}

class XuWuJing extends Person{

   XuWuJing(String name, QQqun qun) {
   	super(name, qun);
   }
   
    void exchange(String message){
   	qun.exchange(this,message);
   }
   
    void talk(String message){
       System.out.println(name +"回应:" + message);
   }
}



最后再来定义具体中介者对象,这个QQ群的具体实现。
代码如下:

class JavaQQqun implements QQqun{
    private ZhangSan zs;
    private XuWuJing xwj;

    public ZhangSan getZs() {
		return zs;
	}

	public void setZs(ZhangSan zs) {
		this.zs = zs;
	}

	public XuWuJing getXwj() {
		return xwj;
	}


	public void setXwj(XuWuJing xwj) {
		this.xwj = xwj;
	}


	@Override
	public void exchange(Person person, String message) {
			if(zs.equals(person)){
				zs.talk(message);
			}else if(xwj.equals(person)){
				xwj.talk(message);
			}
	}
}


最后再来进行测试,定义好交流平台以及需要交流的人员。
那么测试代码如下:


public static void main(String[] args) {
    JavaQQqun jq = new JavaQQqun();  
   	ZhangSan zs = new ZhangSan("张三", jq);
   	XuWuJing xwj = new XuWuJing("xuwujing", jq);
   	jq.setZs(zs);
   	jq.setXwj(xwj);      
   	zs.exchange("大家好!我是张三!");
   	xwj.exchange("欢迎你!张三!");

}


输出结果:
张三说:大家好!我是张三
xuwujing回应:欢迎你!张三!

总结

中介者模式优点:
灵活性高,因为将同事类进行了解耦,使其不必有关联性;
降低了类的复杂度,将一对多转化成了一对一;

中介者模式缺点:
中介者使用过多,会使系统变得复杂难以维护;

使用场景:
通过一个中间类来封装多个类中的行为,而又不想生成太多的子类

注意事项:
若不明确各个类的职责,那么就不要进行使用!

和外观模式、代理模式比较
中介者模式和外观模式、代理模式比较类似,但是又有不同。
和外观模式比较,中介者模式中,同事类必须依赖与中介者,中介者也知道同事类;但是外观模式中,子系统是不需要知道外观类的存在,并且子系统是可以脱离外观模式的。
和代理模式,代理模式的核心就是代理作用,主要还是对原先的类进行扩展或增加控制,比如进行权限控制;而中介者模式主要目的是为了减少对象之前的耦合,也就是同事类直接相互独立,互不影响。

参考文章:https://www.cnblogs.com/xuwujing/p/9911997.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
系统测试管理员为:admin 密码:admin ,正式使用时请更改密码。 EIMS基于先进的B/S架构,不需要安装任何客户端,只要有网络的地方就可以使用,利用它您可以很方便的管理分布在全国乃至世界各地的销售团队和经销商,让管理无处不在。同时每个用户的销售管理平台都是一套独立的系统,都安装在用户自己的服务器上,客户资料和销售信息都保存在自己的服务器上,从根本上保证了数据信息的安全。EIMS适用于各行业企业市场销售、客户服务、售后管理、财务管理、日常办公等,用于全面管理企业各客户档案、客户销售、产品销售、财务情况和售后服务等信息的建立,规范客户、销售、产品、财政、售后资源库,并实现对客户资源、产品销售的动态跟踪管理及客户价值再挖掘,真正发挥客户、销售资源的作用,全面有效利用一切资源,为企业达到“抓住客户、扩大销售、高效管理”的目的。 用户把平台安装在自己的服务器上后,可以自由分配帐号名称和数量,数量不限,使用期限不限。 EIMS系统数据存储格式统一,方便管理维护。数据输出格式统一为:列表,编辑,分,属性[个别无]。 列表:所在项目信息列表,可分查看,搜索,超级管理员和该项目管理员可编辑,删除。 编辑:添加和修改单条信息。 分:编辑所在项目的分,为无限分。 属性:设置所在项目的数据标题项和该栏目的显示数量,并可设置显示与隐藏,设置是否有备注项。 请注意:1、添加用户名称不得小于2个字符并且不能大于8个字符; 2、普通用户可以浏览没有隐藏的信息[属性一栏可设置该项目是否隐藏][新闻与通讯录系统默认为公开,用户为隐藏]; 3、请先添加用户,若设置该用户为管理员,先设置为管理员组,然后在管理员组中设置其管理权限。请至少保留一个超级管理员; 4、项目属性一栏可以设置1-12个属性[房源18个],请填写显示数量,否则属性项不能正常显示。备注项为可选项。 5、请做好数据备份工作,避免数据丢失。房产中介管理系统客户请及时删除旧的房源浏览日记。 公共信息:新闻公告,通 讯 录,公共资源的管理 生产管理:房产中介系统为:房源管理 销售系统:房产中介系统为:客户管理 财务管理:流动资产,固定资产,费用支出,成本管理,工资管理,收入管理 考勤系统:添加今日考勤,我的考勤,所有考勤 工作计划:添加计划,我的计划 用户管理:管理用户,增加用户,管理员组 系统信息:公司档案:编辑公司相关信息。 常用工具:常用网址, 万 年 历, 计 算 器 信息交流:邮件系统, 信息反馈:用户[员工]对管理员或对公司的意见和建议。 文件操作:图片文件操作, 其他文件操作:对上传的图片和文件进行管理,主要是删除的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不能吃辣的JAVA程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值