设计模式总结--------调停者模式
目录
1,使用场景
2,准备工作
2.1 person类
2.2 Students类
2.3 Teacher类
3 调停者
3.1 接口 MediatorInterface
3.2 实现类:MasterJiImpl
MasterJiImpl类实现了调停者接口中的switchCall方法,对任意发过来的请求进行处理和转发,实现person对象之间的调用,这几个类的结构图如下
4 演示
先定义2个老师对象,3个学生对象,通过MasterJiImpl的addPerson方法将5个对象添加到MasterJiImpl中的成员变量personMap中,再调用MasterJiImpl的switchCall方法实现对象间的调用,运行结果如下
5 总结
通过调停者模式可以有效的带来下面的几个有点
1.组件间的耦合度降低
2. 多对多的复杂模型变成一对多的简单模型
3. 组件间的交互集中控制
调停者模式使控制集中化,所有的交互行为都集中在调停者类中,但随着调停者类变的日益庞大,其维护成本会越来越大
1,使用场景
家庭中成员的沟通交流,班级中同学之间的交流,工作中任务的协调,当互动的对象达到一定数量后.简单的对象到对象的调用就会显得过于复杂,这个时候就需要一个中间人来承担沟通协调的角色,这就是调停者在现实中的使用场景.代码中通过调停者模式可以将复杂的多对多关系转化为简单的一对多多对一的关系,通过调停者这一服务可以极大降低代码中对像间调用的耦合度.
2,准备工作
2.1 person类
package demo;
/** * @author 作者 Your-Name:Pxy * @version 创建时间:2020年11月6日 下午8:38:31 * 类说明 人共有属性*/
public class Person {private String name ;//姓名private String gender;//性别private String age;//年龄private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public Person(String name, String gender, String age,String message) {super();this.name = name;this.gender = gender;this.age = age;this.message = message;}public Person(String name, String gender, String age) {this.name = name;this.gender = gender;this.age = age;}public Person() {super();}@Overridepublic String toString() {return "我叫"+name+",我是一名"+age+"岁的"+gender+"我的任务信息是"+message;}}
2.2 Students类
package demo;/** * @author 作者 Your-Name:Pxy * @version 创建时间:2020年11月6日 下午7:55:12 * 类说明 学生的实体类 ,除了有person类的基础属性外,还有一些自己特有的方法*/
public class Students extends Person{
public static final String StudentsFlag = "[学生处理请求]::";public Students() {//构造方法super();}public Students(String name, String gender, String age, String message) {//构造方法super(name, gender, age, message);}public Students(String name, String gender, String age) {//构造方法super(name, gender, age);}public void doHomeWork(String requestId,Person person){System.out.println(requestId+StudentsFlag+"我是"+this.getName()+"."+person.getName()+"让我"+person.getMessage()+"我完成了");}public void doSelf(String requestId,String message){System.out.println(requestId+StudentsFlag+"我是"+this.getName()+".我我完成了"+super.getMessage());}public void play(String requestId,Person person){System.out.println(requestId+StudentsFlag+"我是"+this.getName()+"."+person.getName()+"找我"+person.getMessage()+".我觉得可以");}}
2.3 Teacher类
package demo;/** * @author 作者 Your-Name:Pxy * @version 创建时间:2020年11月6日 下午8:40:00 * 类说明 老师的一个实体,除了有person类的基础属性外,还有一些自己特有的方法*/
public class Teacher extends Person {public static final String TeacherFlag = "[老师处理请求]";public Teacher() {super();}public Teacher(String name, String gender, String age, String message) {super(name, gender, age, message);}public Teacher(String name, String gender, String age) {super(name, gender, age);}public void putResources(String requestId ,Person person){System.out.println(requestId+TeacherFlag+"我是"+this.getName()+"."+person.getName()+"需要"+person.getMessage()+".我找了一下发现没有");}}
说明:每一个person对象都有姓名,性别,年龄和任务信息的基础信息,而子类Teacher有Teacher特有的putResources方法,学生有学生特有的doWork,doSelf,和play方法.对象之间没有直接的调用,而是通过调用接下来的Master类间接的实现对象之间的互调
3 调停者
3.1 接口 MediatorInterface
package demo;/** * @author 作者 Your-Name:Pxy * @version 创建时间:2020年11月6日 下午7:47:32 * 类说明 */
public interface MediatorInterface {/*** 调停的方法* @param requestId 请求id ,放在日志中用于记录,一个requestId代表一个请求,* @param requestPerson 请求发出方* @param recivePerson 请求接收方* 创建时间:2020年11月7日 下午12:06:30*/public void switchCall( Person requestPerson,Person recivePerson);
}
3.2 实现类:MasterJiImpl
package demo;import java.util.HashMap;
import java.util.Map;/** * @author 作者 Your-Name:Pxy * @version 创建时间:2020年11月6日 下午7:51:41 * 类说明 */
public class MasterJiImpl implements MediatorInterface{//打印日志用的一个标记public static final String MediatorFlag = "[调停者处理请求]:";//多态,子类引用指向父类 使参数更灵活private Map<String,Object> personMap = new HashMap<String, Object>();@Overridepublic void switchCall( Person requestPerson,Person recivePerson) {System.out.println(MediatorFlag+":[----开始-----]");System.out.println(MediatorFlag+":请求发出者:["+requestPerson.getName()+"].请求受理者:["+recivePerson.getName()+"]");reciveRequest( requestPerson.getName(), recivePerson);System.out.println(MediatorFlag+":[----完成-----]");}/*** 根据请求接收方定位处理请求的方法* @param requestId* @param requestPerson* @param recivePerson* 创建时间:2020年11月7日 下午12:07:47*/private void reciveRequest( String requestName,Person recivePerson) {System.out.println(MediatorFlag+":请求者为:["+requestName+"]");System.out.println(MediatorFlag+":被请求者为:["+recivePerson.getName()+"]");if(recivePerson instanceof Teacher){ System.out.println(MediatorFlag+":有人找老师要资源");Teacher teacher = (Teacher)recivePerson;Students students = (Students)personMap.get(requestName);teacher.putResources( students);}else if(recivePerson instanceof Students){Students students = (Students)recivePerson;Person person = (Person)personMap.get(requestName);studentAction( person, students);}}/*** 当请求接收方式学生时,通过这个方法判断这个请求是需要学生干嘛* @param requestId* @param requestPerson* @param students* 创建时间:2020年11月7日 下午12:08:34*/private void studentAction(Person requestPerson,Students students){if(requestPerson==null){System.out.println(MediatorFlag+"[请求信息为空,你想干嘛不妨直说?]");}else if(requestPerson instanceof Students){if(requestPerson.getName().equals(students.getName())){System.out.println(MediatorFlag+"学生自己完成任务");students.doSelf(requestPerson.getMessage());}else{System.out.println(MediatorFlag+"学生们在一起玩耍");students.play(requestPerson);}}else if(requestPerson instanceof Teacher){System.out.println(MediatorFlag+":老师给学生布置作业");students.doHomeWork(requestPerson);}}/*** 用来将人员信息添加至personMap中,供调停者调用* @param person* 创建时间:2020年11月7日 下午12:04:29*/public void addPerson(Person person){personMap.put(person.getName(), person);}}
MasterJiImpl类实现了调停者接口中的switchCall方法,对任意发过来的请求进行处理和转发,实现person对象之间的调用,这几个类的结构图如下
4 演示
package com.sgcc.demo;import java.util.UUID;import org.junit.Test;/** * @author 作者 Your-Name:Pxy * @version 创建时间:2020年11月7日 上午10:06:43 * 类说明 */
public class MediatorDemo {@Testpublic void TestDemo() {Teacher teacherPeng = new Teacher("彭老师", "男老师", "18");Teacher teacherLiu = new Teacher("刘老师", "男老师", "18");Students studentsLi = new Students("李同学","小女生","18");Students studentsWang = new Students("王同学","小男孩","15");Students studentsJi = new Students("纪同学","小女生女","18");MasterJiImpl masterJiImpl = new MasterJiImpl();masterJiImpl.addPerson(teacherPeng);masterJiImpl.addPerson(teacherLiu);masterJiImpl.addPerson(studentsLi);masterJiImpl.addPerson(studentsWang);masterJiImpl.addPerson(studentsJi);String requestId = UUID.randomUUID().toString().replaceAll("-", "");/** 彭老师给李同学布置作业,让她讲调停者模式*/
// teacherPeng.setMessage("介绍调停者模式");
// masterJiImpl.switchCall(requestId, teacherPeng,studentsLi);/** 李同学自己自学了工厂模式*/
// studentsLi.setMessage("自学工厂模式");
// masterJiImpl.switchCall(requestId, studentsLi, studentsLi);/** 李同学找纪同学吃米粉*/studentsLi.setMessage("快乐的吃米粉");masterJiImpl.switchCall(studentsLi, studentsJi);/** 李同学问刘老师要彭老师的电话*/
// studentsLi.setMessage("彭老师的电话");
// masterJiImpl.switchCall(requestId, studentsLi, teacherLiu);}}
先定义2个老师对象,3个学生对象,通过MasterJiImpl的addPerson方法将5个对象添加到MasterJiImpl中的成员变量personMap中,再调用MasterJiImpl的switchCall方法实现对象间的调用,运行结果如下
5 总结
通过调停者模式可以有效的带来下面的几个有点
1.组件间的耦合度降低
2. 多对多的复杂模型变成一对多的简单模型
3. 组件间的交互集中控制
调停者模式使控制集中化,所有的交互行为都集中在调停者类中,但随着调停者类变的日益庞大,其维护成本会越来越大
设计模式总结--------调停者模式相关推荐
- java手动切换成独立显卡_JAVA设计模式之调停者模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...
- 调停者模式 java_JAVA设计模式之调停者模式详解
在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...
- JAVA设计模式之调停者模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...
- 设计模式之调停者模式
如有转载,请申明: 转载至 http://blog.csdn.net/qq_35064774/article/details/52096987 1 什么是调停者模式 调停者模式包装了一系列对象相互作 ...
- 设计模式系列-调停者模式-Mediator
调停者模式简介 良好设计的应用由轻量级的对象组合而成,这些对象具有特定的职责,符合SOILD 的单一职责原则.然而,这些大量轻量级的对象给应用带来好处的同时也带来了对象之间交互通信的挑战.对象间需要通 ...
- [设计模式] 调停者模式(Mediator Pattern)
什么是调停者模式? 调停者模式是一种旨在降低一系列对象之间耦合关系的设计模式.在一个系统中,对象与对象之间是不可避免发生各种通信,共同合作完成特定的功能.我们把这些对象成为同事对象(Collegue) ...
- java 设置模式_Java设计模式百例 - 调停者模式
调停者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性的.这种模式提供了一个调停者类,用来充当"中心化"或"总线化"的角色,与各个 ...
- 设计模式之门面模式和调停者模式
文章目录 前言 一.门面模式Facade 1.定义 2.案例说明 3.代码实现 二.调停者模式Mediator 1.定义 2.案例说明 3.代码实现 总结 前言 本人对于设计模式的学习,仅供参考! 一 ...
- java设计模式---调停者模式
中介者模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 通用类图: 举例:在一个公司里面,有 ...
最新文章
- http编程学习(C#)
- 【自然语言处理】ACL 2020 清华大学系列论文直播分享
- Java 7 Swing:创建半透明和成形的Windows
- 【渝粤教育】国家开放大学2019年春季 289法理学 参考试题
- LeetCode 540. 有序数组中的单一元素(位运算二分查找)
- [转] 外企面试官最爱提的问题 TOP10
- linux 程序/usr
- BCH恢复禁用的脚本操作码[草案]
- SAL Annotations的介绍
- XSD文件详解(以Maven为例)
- 17、【易混淆概念集】第十一章1 项目风险 风险临界值 VS 风险承受力 风险管理流程 风险管理及变更流程 规划风险管理 识别风险
- 使用pure-ftpd快速部署FTP服务
- 邓俊辉数据结构学习心得系列——如何正确衡量一个算法的好坏
- B站 根据BV 获取av号 api
- 【Linux】使用grep命令查找文件内容
- 计算机flash方面参考文献,flash毕业论文参考文献(2)
- php如何导出数据库,PHP导出数据库方法
- 武僧一龙狂殴韩国拳王 用中国功夫醉拳轻松赢战
- 基于PHP+MySQL的在线投票系统设计与实现
- 高通平台开发系列讲解(PCIE篇)MHI (Modem Host Interface)驱动详解
热门文章
- 【转】类别catagory的用法
- 成功解决无法写入输出文件,此实现不是Windows平台FIPS验证加密算法的一部分
- Android Studio怎么把查看代码的左箭头、右箭头图标加到右边的快捷工具栏
- python如何提取word文档某个段落所有内容(包括段落、表格、图片一并提取)
- 跳槽穷半年,转行穷三年,死守会穷一辈子
- Linux+C 开发基础
- 自定义Tab切换+自定义CheckBox+light7无限滑动/下拉刷新
- 868. Binary Gap*
- uni-app开发app之一uni-app优缺点
- pack与aligned的区别