一、前言

Mediator模式又称为仲裁者模式或中介者模式,所起的作用就是仲裁和中介,帮助其它类之间进行交流。在仲裁者模式之中,我们要明确两个概念,那就是仲裁者(Mediator)和组员(Colleague),不管组员有什么事情,都会向仲裁者汇报,仲裁者会根据全局的实际情况向其他Colleague作出指示,共同完成一定的逻辑功能。

二、代码

Mediator接口:(仲裁者接口)

package designMode.mediator;public interface Mediator {public abstract void createColleagues();public abstract void ColleagueChanged();
}

 Colleague 组员接口:

package designMode.mediator;public interface Colleague {public abstract void setMediator(Mediator mediator);public abstract void setColleagueEnable(boolean enable);
}

ColleagueButton实现类:

package designMode.mediator;import java.awt.*;public class ColleagueButton extends Button implements Colleague {private static final long serialVersionUID = 1309335015058337931L;public ColleagueButton(String caption){super(caption);}private Mediator mediator;@Overridepublic void setMediator(Mediator mediator) {this.mediator=mediator;}@Overridepublic void setColleagueEnable(boolean enable) {setEnabled(enable);}
}

ColleagueCheckBox实现类:

package designMode.mediator;import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;public class ColleagueCheckBox extends Checkbox implements ItemListener,Colleague {private static final long serialVersionUID = -628547709974079324L;public ColleagueCheckBox(String caption,CheckboxGroup g,boolean b){super(caption,g,b);}private Mediator mediator;@Overridepublic void setMediator(Mediator mediator) {this.mediator=mediator;}@Overridepublic void setColleagueEnable(boolean enable) {setEnabled(enable);}@Overridepublic void itemStateChanged(ItemEvent e) {mediator.ColleagueChanged();}
}

ColleagueTextField实现类

package designMode.mediator;import java.awt.*;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;public class ColleagueTextField extends TextField implements TextListener,Colleague {private static final long serialVersionUID = 8539124564669846422L;public ColleagueTextField(String text,int columns){super(text,columns);}private Mediator mediator;@Overridepublic void setMediator(Mediator mediator) {this.mediator=mediator;}@Overridepublic void setColleagueEnable(boolean enable) {setEnabled(enable);setBackground( enable? Color.WHITE : Color.BLACK );}@Overridepublic void textValueChanged(TextEvent e) {mediator.ColleagueChanged();}
}

LoginFrame实现类

package designMode.mediator;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class LoginFrame extends Frame implements ActionListener, Mediator {private static final long serialVersionUID = -509490729876024682L;private ColleagueButton buttonOK;private ColleagueButton buttonCancel;private ColleagueCheckBox chkGuest;private ColleagueCheckBox chkUser;private ColleagueTextField tfUser;private ColleagueTextField tfPass;public LoginFrame(String title){super(title);setBackground(Color.lightGray);setLayout(new GridLayout(4,2));createColleagues();add(chkGuest);add(chkUser);add(new Label("用户名:"));add(tfUser);add(new Label("密码:"));add(tfPass);add(buttonOK);add(buttonCancel);ColleagueChanged();pack();show();}public void createColleagues() {CheckboxGroup chk=new CheckboxGroup();chkGuest=new ColleagueCheckBox("Guest",chk,true);chkUser=new ColleagueCheckBox("User",chk,false);buttonOK=new ColleagueButton("OK");buttonCancel=new ColleagueButton("Cancel");tfUser=new ColleagueTextField("",10);tfPass=new ColleagueTextField("",10);tfPass.setEchoChar('#');chkGuest.setMediator(this);chkUser.setMediator(this);buttonOK.setMediator(this);buttonCancel.setMediator(this);tfUser.setMediator(this);tfPass.setMediator(this);chkGuest.addItemListener(chkGuest);chkUser.addItemListener(chkUser);buttonOK.addActionListener(this);buttonCancel.addActionListener(this);tfUser.addTextListener(tfUser);tfPass.addTextListener(tfPass);}public void ColleagueChanged() {if(chkGuest.getState()){tfUser.setColleagueEnable(false);tfPass.setColleagueEnable(false);buttonOK.setColleagueEnable(true);}else{tfUser.setColleagueEnable(true);userPassChanged();}}private void userPassChanged() {if(tfUser.getText().length()>0){tfPass.setColleagueEnable(true);if(tfPass.getText().length()>0){buttonOK.setColleagueEnable(true);}else{buttonOK.setColleagueEnable(false);}}else{tfPass.setColleagueEnable(false);buttonOK.setColleagueEnable(false);}}public void actionPerformed(ActionEvent e) {System.out.println(e.toString());System.exit(0);}
}

Main方法

package designMode.mediator;public class Main {public static void main(String[] args) {LoginFrame login = new LoginFrame("仲裁者模式");}
}

运行结果

游客访问,不用输入用户名和密码,因此禁用。

会员访问,只有输入用户名之后才能输入密码,用户名可用,密码暂不能用,登录按钮OK不可用。

会员访问,输入用户名和密码之后,登录按钮OK可用。

点击登录按钮OK:

分析:这些组件(按钮、文本框、单选框)每一个发生改变之后就要导致其他组件发生改变,比如用户名文本框改变,密码文本框也要响应改变,如果我们直接让这两个文本框之间产生交互,我们应该怎样写代码呢?我们可能在用户名文本框发生改变的函数中通知密码文本框,让密码文本框可用,那么我们需要得到密码文本框的对象,这必定是一件非常难以做到的事情,同样的,密码文本框的改变还要使得按钮发生改变,我们势必会将密码文本框和按钮之间再次建立联系(传递参数),这也是一件非常复杂的事情,同样的单选框发生改变,两个文本框和一个按钮都要发生改变,这又要在单选框之中得到这些组件的对象,然后才能改变这些组件的状态,但是单选框都有两个,来自于同一个类,我们要怎么识别呢,可能还要通过一定的方法得到单选框的ID,这是极其复杂的,最让人难以接受的是,如果需求发生了改变,比如又增加了一个控件,剩余的所有组件的代码都要修改,而这些代码之间本就混乱无比,再次修改就更让人难以接受了,因此这不是一个好的办法,甚至可以说是一个非常差的解决办法。

那么有什么好的解决办法吗?那就是将这些复杂的逻辑操作独立出来,新创建一个类,在每个空间的状态发生改变的时候就能通过某种方式通知这个类,让这个类改变这些控件的状态,这样说来这个新的类应该持有这些控件的引用,这样才能委托这些控件去改变自己的状态,同时这些控件要想通知这个新的类,那就要持有这个类的引用,这样才能委托新的类去实现所有状态的改变。这样我们的思路就清晰明了了,如果一个再增加一个新的控件,需要添加逻辑,我们只需要修改仲裁者的方法,就可以做到全局的掌控,达到了修改最少的代码来扩展程序的行为,因此仲裁者模式非常的重要和实用。

三、总结

对我们的程序而言,仲裁者模式适合于某一个部分发生改变就会导致其他部分作出相应的改变的情况,我们将这种变换的规律抽象出来,编程仲裁者,从而很好地协商各个部分,当组员有问题的时候,直接告诉仲裁者,不与其它成员打交道,让仲裁者赋值这些繁琐的事务,这样条理就很清晰了,因此仲裁者也成为中介者,可以想象很多人要去租房,很多人要把房子出租,如果私下里面去商量,既浪费时间,又很难找到对方,通过中介这个对象,它收集了很多的租房和出租房的信息,这样就能很快的找到最适合的房子。由此可见生活就是最好的设计模式。仲裁者模式对于代码的修改(很容易定位错误)、新的成员的加入、代码的复用(组员部分可以复用,仲裁者部分不易复用)都有着一定的简化,将该集中处理的集中起来,将该分散的分散出去,无疑是一种好的设计模式。对比于外观模式Facade,仲裁者需要和组员沟通,是双向的,而外观模式facade角色只是对其他角色进行整合,是单向的。设计模式至今我们已经研究了16种了,这其中很多设计模式都是有着关联的,同样也有着不同之处,但是都和实际问题是分不开的,设计模式是实际问题的抽象和解决方法,为了提高可扩展性和组件化,实际问题是设计模式的来源和最终归宿。

浅谈设计模式<最通俗易懂的讲解>

浅谈Mediator仲裁者模式相关推荐

  1. 浅谈企业中台商业模式及建设思路

    浅谈企业中台商业模式及建设思路 文章目录 浅谈企业中台商业模式及建设思路 前言 企业中台的定义和能力 企业中台的商业故事 企业中台的商业模式 构建企业中台时不同的企业初衷 企业中台的价值主张 企业中台 ...

  2. 16、Mediator 仲裁者模式

    只有一个仲裁者 Mediator 模式 组员向仲裁者报告,仲裁者向组员下达指示,组员之间不在相互询问和相互指示. 要调整多个对象之间的关系时,就需要用到 Mediator 模式.将逻辑处理交给仲裁者执 ...

  3. js架构设计模式——由项目浅谈JS中MVVM模式

    1.    背景 最近项目原因使用了durandal.js和knockout.js,颇有受益.决定写一个比较浅显的总结. 之前一直在用SpringMVC框架写后台,前台是用JSP+JS+标签库,算是很 ...

  4. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  5. 浅谈软件开发架构模式

    本文作者将介绍他对于软件开发架构模式的一些思考和实践. 背景和问题 我个人平时会比较慎用"架构"这个词 一方面是觉得业界有很多架构大师和架构模式,而我的认知和实践有限: 另一方面是 ...

  6. 精通python设计模式-浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  7. 浅谈设计模式01-策略模式

    2019独角兽企业重金招聘Python工程师标准>>> 一. 定义 最近开始研读Head First设计模式,这本书给人的感觉耳目一新,不容易犯困啊.今天和大家分享一下策略模式. 1 ...

  8. C#框架设计之浅谈SOA与钝化模式

    一. 什么是SOA SOA即为Service-Oriented Architecture缩写,翻译过来也就是面向服务的软件架构.通过将软件功能或者是业务流程进行服务化发布,从而达到一种面向于契约和服务 ...

  9. 浅谈Ble-Mesh的LPN模式

    选择LPN模式的原因: 能有效的降低产品功耗. 比如:一个温湿度传感器产品,需要超过设定阈值才会从上送数据,这样就没有长时间唤醒时间,就无法接收到网关下发的设置数据,这时候就需要LPN模式.LPN的节 ...

最新文章

  1. python c扩展
  2. php安全性差,PHP安全性防范方式
  3. 四大组建进程间通信--基础
  4. 表单新增元素与属性(control、placehoulder、list、AutoComplete、pattern、SelectionDirection、indeterminate属性)
  5. 如何买卖股票?不要慌,我有妙招!
  6. python实验三答案_20192116 实验三《Python程序设计》实验报告
  7. python 拟牛顿法 求非线性方程_9-非线性优化
  8. 前方两万字高能预警!SMBGhost SMBleed 漏洞深入研究
  9. python和c先学哪个-python和c先学哪个
  10. 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)...
  11. eclipse下载及安装教程
  12. 搭建STM32开发环境——STM32CubeMX并配合Keil5重写跑马灯程序
  13. C语言课程设计|职工工资管理系统
  14. 点餐小程序购物车效果实现
  15. Spark 高难度对话 SQL Server - 续篇
  16. 正点原子的TPAD键用不了
  17. unity模型制作(终章):柔体布料绘制
  18. 打开小米5开发者选项
  19. 全球及中国红外探测器芯片行业发展动态及投资应用前景调研报告2021-2027年
  20. 点云公开数据集:Semantic3D

热门文章

  1. SNS运营之Tumblr迅速涨粉的20个方法-适用于海外社媒推广,外贸独立站,自建站,让你粉丝快速翻倍
  2. 分享几个搜索电子书网站
  3. 翼灵物联工作室第一次考试总结
  4. 数据结构与算法实验6——图论 7-9 哥尼斯堡的“七桥问题”
  5. 链路追踪译文学习记录(Dapper!!!非原创!!!学习记录)
  6. mysql limt取指定数据条数 top取指定数据条数
  7. linux系统下载18.04,在Ubuntu 18.04系统中下载安装Persepolis Download Manager
  8. 搜狗的2019年:录音笔开辟智能硬件新战场,语言AI要在C端找准点
  9. 小蛋机器人app_阿尔法蛋编程APP
  10. 查询Linux中CPU的核数