设计模式-中介者模式(21)
定义
中介者模式(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.
翻译:用一个中介者对象封装一系列对象(同事)的交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且中介者可以独立地改变它们之间的交互。
角色:
抽象中介者(Mediator)角色:该角色定义出同事对象到中介者对象的同一接口,用于各同事角色之间的通信。
具体中介者(Concrete Mediator)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为。
抽象同事(Colleague)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象。
具体同事(Concrete Colleague)角色:该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的。
/*** 抽象中介者模式*/ public abstract class Mediator {//中介者模式的业务逻辑方法,使封装的对象不用显示的相互作用public abstract void colleagueChanged(Colleague colleague); }/*** 具体中介者*/ public class ConcreteMediator extends Mediator{private ConcreteColleague1 c1;private ConcreteColleague2 c2;//中介者模式的业务逻辑方法,使封装的对象不用显示的相互作用public void colleagueChanged(Colleague c){c1.action();c2.action();}//工厂方法,创建同事对象public void createConcreteMediator(){c1 = new ConcreteColleague1(this);c2 = new ConcreteColleague2(this);}//获取同事对象public ConcreteColleague1 getC1(){return c1;}//获取同事对象public ConcreteColleague2 getC2(){return c2;} }/*** 抽象同事类*/ public abstract class Colleague {private Mediator mediator; //因为需要调用中介者的方法,所以要把中介者传进来.如果是中介者方法为静态方法则不必要//构造函数public Colleague(Mediator mediator) {this.mediator = mediator;}//getter和setter方法public Mediator getMediator() {return mediator;}public void setMediator(Mediator mediator) {this.mediator = mediator;}//抽象行动方法,由子类实现public abstract void action();//核心业务方法.这个方法看似是本对象和其他对象交互,其实是调用中介者的方法,把自己作为方法参数.委托中介者完成功能public void change(){this.mediator.colleagueChanged(this);}}/*** 具体同事类1*/ public class ConcreteColleague1 extends Colleague {//构造函数public ConcreteColleague1(Mediator mediator) {super(mediator);}@Overridepublic void action() {System.out.println("这是同事1的行动方法!");} }/*** 具体同事类2*/ public class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}@Overridepublic void action() {System.out.println("这是具体同事类2的方法!");} }
源码
优点
- 减少类间的依赖。将类之间原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易理解和维护。
- 避免同事对象之间的过度耦合。同事类只依赖于中介者,这使同事类更易被复用,中介类和同事类可以相对独立地演化。
- 中介者模式将对象的行为和对象间的协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。
缺点
- 中介者模式降低了同事对象的复杂性,但增加了中介者类的复杂性。
- 中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不可复用的。
注意事项
中介者模式简单,但是简单不代表容易使用,它很容易被误用和滥用。在面向对象的编程中,对象和对象之间必然会有依赖关系,如果某个类和其他类之间没有任何依赖关系,那这个类就是一座孤岛,它在系统中没有存在的必要。一个类依赖多个类的情况是正常的,存在就有其合理性,但并不是只要有多个依赖关系就考虑使用中介者模式。在下列情况不适合使用中介者模式:
- 中介者模式不应当在责任划分混乱时使用。通常的情况下,当一个初级设计师对面向对象的技术不熟悉时,会使一个系统在责任的分割上发生混乱。责任分割的混乱会使得系统中的对象与对象之间产生不适当的复杂关系。
- 中介者模式不应当对数据类和方法类使用。初级设计师常常会设计出这样一中系统:让一系列类只含有数据,另一些类只含有方法。
- 正确理解封装类。封装首先是行为,其次是行为所涉及的状态。行为与状态是不应当分割开来的。中介者模式用来管理很多对象的相互作用,以便使这些对象可以专注于自身的行为。
/*** 婚姻中介所接口*/ public interface MarriageAgency {void pair(Person person); //为person配对void register(Person person); //注册会员 }/*** 中介所实现类*/ public class MarriageAgencyImpl implements MarriageAgency{List<Man> men = new ArrayList<Man>(); //男会员List<Woman> women = new ArrayList<Woman>(); //女会员 @Overridepublic void pair(Person person) {if (person.sex == Sex.MALE){for (Woman w:women){if (w.age == person.requestAge){System.out.println(person.name+"和"+w.name+"配对成功!");return;}}}else if(person.sex == Sex.FEMALE){for (Man m:men){if (m.age == person.requestAge){System.out.println(person.name+"和"+m.name+"配对成功!");}}}System.out.println("未找到合适人选!!!");}@Overridepublic void register(Person person) {if (person.sex == Sex.MALE){men.add((Man) person);}else if (person.sex == Sex.FEMALE){women.add((Woman) person);}} }/*** 人抽象类*/ public abstract class Person {String name; //姓名int age; //年龄Sex sex; //性别int requestAge; //要求对象的年龄.对对象 Person requestPerson;MarriageAgency agency; //婚姻中介public Person(String name, int age, Sex sex, int requestAge, MarriageAgency agency) {this.name = name;this.age = age;this.sex = sex;this.requestAge = requestAge;this.agency = agency;agency.register(this); //注册会员,将自己注册到中介所中 }public void findPartner(){ //寻找对象agency.pair(this); //根据自己的数据(obj.requestPerson)查找 } }/*** 性别枚举*/ enum Sex {MALE,FEMALE; }/*** 男人类*/ public class Man extends Person{public Man(String name, int age, int requestAge, MarriageAgency agency) {super(name, age, Sex.MALE, requestAge, agency);} }/*** 女人类*/ public class Woman extends Person{public Woman(String name, int age, int requestAge, MarriageAgency agency) {super(name, age, Sex.FEMALE, requestAge, agency);} }/*** 测试类*/ public class Main {public static void main(String[] args) {MarriageAgency agency = new MarriageAgencyImpl(); //姓名为allen,27岁的man对象,寻找28岁异性//agency为中介所,在构造函数中会把自己构造的对象传递到angency中Person m1 = new Man("allen",27,28,agency);Person m2 = new Man("sywer",25,20,agency);Person w1 = new Woman("catalin",28,23,agency);Person w2 = new Woman("feilicity",25,23,agency);m1.findPartner(); //看似是m1调用查找伴侣方法,其实是调用了agency.find(this),即m1执行此方法调用中介所的find方法,而本身作为一个参数传递过去. m2.findPartner();} }
个人总结:
1.在实例化同事类的时候,中介者作为构造参数media,并在构造函数中执行media.regist(this)把自己注册到中介者中去。
2.实例化的同事类调用方法(和其他类交互的方法),底层为中介者调用find(this)把自己作为参数,让中介者替自己执行和其他类交互的方法(核心业务,各个类不需要显示调用)。
源码
/*** 中介者-聊天室*/ public class Chat {public static void showMessage(User user,String msg){System.out.println(new SimpleDateFormat("yyyy-dd-hh-mm-ss").format(new Date())+" "+user.getName()+": "+msg);} }/*** 聊天用户*/ public class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name) {this.name = name;}public void sendMsg(String msg){Chat.showMessage(this,msg); //中介者静态方法,所以同事类中不需要有中介者对象 } }/*** 测试*/ public class MainDemo {public static void main(String[] args) {User u1 = new User("sywer");User u2 = new User("catalin");u1.sendMsg("hello!");u2.sendMsg("bye");} }
源码
转载于:https://www.cnblogs.com/aeolian/p/8921688.html
设计模式-中介者模式(21)相关推荐
- Python设计模式-中介者模式
Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...
- 7. 星际争霸之php设计模式--中介者模式
题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...
- 【设计模式】Java设计模式 - 中介者模式
Java设计模式 - 中介者模式
- 设计模式中介者模式-备忘录模式-状态模式
设计模式 中介者模式 基本介绍 中介者模式使用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式属于行为模式,使 ...
- 设计模式-中介者模式(Mediator Pattern)
设计模式-中介者模式(Mediator Pattern) 文章目录 设计模式-中介者模式(Mediator Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.总 ...
- PHP设计模式——中介者模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 中介者模式用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的 ...
- 设计模式-中介者模式详解
定义 中介模式的英文翻译是 Mediator Design Pattern.在 GoF 中的<设计模式>一书中,它是这样定义的: Mediator pattern defines a se ...
- 大话设计模式—中介者模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. ...
- [设计模式]中介者模式之Events消息传递实现
这篇文章比较短,修改自 写给大家看的设计模式之中介者中的例子 中介者模式的定义和目的自不必说, 参考上文即可. 本文针对实现方式做一个补充. 中介者模式增加了一个第三方对象(中介者)来控制两个对象(同 ...
最新文章
- 如何在OpenCV中为InRange阈值选择颜色的最佳HSV值
- 解决多线程安全问题-无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法 (百度-美团)
- 精通python能干什么-Python学到什么程度才算精通?天津Python培训
- 【论文阅读】A social recommender system using item asymmetric correlation
- 文巾解题 14. 最长公共前缀
- 9、MySQL中SQL语句的大小写规则
- 广州海珠区计算机学校,2019广州海珠区电脑派位和对口直升表
- python拆分excel的sheet为单文件_pandas处理excel一个sheet拆分为多个sheet
- switch c语言讲解,C语言switch使用之诡异用法详解
- 【零基础学Java】—继承父类并实现多个接口(二十五)
- 数据时代,嵌入式工程师必须知道的八大加密算法
- Extjs4.1.1视频教程下载
- 免费后台管理UI界面、html源码推荐
- python职场应用英语作文_职场英语作文万能句子
- 【微积分的本质|笔记】隐函数求导的意义与理解
- 区块链第一个落地场景,居然是“发票”?
- diagrams 一个完全可以代替visio的软件
- 4G 5G 频段介绍
- 穆迪分析的IFRS 9解决方案赢得两项风险技术奖
- QQ坦白说之解密教程
热门文章
- python 将数组转化8位整数_int对象,永不溢出的整数
- this super java_java中 this 和super的用法
- openmp并行编程_OpenMP实现生产者消费者问题
- 从第一范式到第二范式所做的操作是_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”
- arcgis超级工具密码_浏览器的自动保存密码是如何将我们的密码泄露的?
- python读取excel,数字都是浮点型,日期格式是数字的解决办法
- 返回顶部小火箭(仿电脑管家)
- C#(.Net)中调用Sql sever汉字字符串显示为?问号
- JavaScript可否多线程? 深入理解JavaScript定时机制
- 为什么安装了Microsoft .NET Framework 4之后我的电脑网卡启动会变得很慢很慢。。...