1、前言java
Mediator模式又称为仲裁者模式或中介者模式,所起的做用就是仲裁和中介,帮助其它类之间进行交流。在仲裁者模式之中,咱们要明确两个概念,那就是仲裁者(Mediator)和组员(Colleague),无论组员有什么事情,都会向仲裁者汇报,仲裁者会根据全局的实际状况向其余Colleague做出指示,共同完成必定的逻辑功能。编程
2、代码设计模式
Mediator接口:(仲裁者接口)ide
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; @Override public void setMediator(Mediator mediator) { this.mediator=mediator; } @Override public void setColleagueEnable(boolean enable) { setEnabled(enable); } }
ColleagueCheckBox实现类:this
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; @Override public void setMediator(Mediator mediator) { this.mediator=mediator; } @Override public void setColleagueEnable(boolean enable) { setEnabled(enable); } @Override public void itemStateChanged(ItemEvent e) { mediator.ColleagueChanged(); } }
ColleagueTextField实现类spa
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; @Override public void setMediator(Mediator mediator) { this.mediator=mediator; } @Override public void setColleagueEnable(boolean enable) { setEnabled(enable); setBackground( enable? Color.WHITE : Color.BLACK ); } @Override public void textValueChanged(TextEvent e) { mediator.ColleagueChanged(); } }
LoginFrame实现类.net
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,这是极其复杂的,最让人难以接受的是,若是需求发生了改变,好比又增长了一个控件,剩余的全部组件的代码都要修改,而这些代码之间本就混乱无比,再次修改就更让人难以接受了,所以这不是一个好的办法,甚至能够说是一个很是差的解决办法。
那么有什么好的解决办法吗?那就是将这些复杂的逻辑操做独立出来,新建立一个类,在每一个空间的状态发生改变的时候就能经过某种方式通知这个类,让这个类改变这些控件的状态,这样说来这个新的类应该持有这些控件的引用,这样才能委托这些控件去改变本身的状态,同时这些控件要想通知这个新的类,那就要持有这个类的引用,这样才能委托新的类去实现全部状态的改变。这样咱们的思路就清晰明了了,若是一个再增长一个新的控件,须要添加逻辑,咱们只须要修改仲裁者的方法,就能够作到全局的掌控,达到了修改最少的代码来扩展程序的行为,所以仲裁者模式很是的重要和实用。
3、总结
对咱们的程序而言,仲裁者模式适合于某一个部分发生改变就会致使其余部分做出相应的改变的状况,咱们将这种变换的规律抽象出来,编程仲裁者,从而很好地协商各个部分,当组员有问题的时候,直接告诉仲裁者,不与其它成员打交道,让仲裁者赋值这些繁琐的事务,这样条理就很清晰了,所以仲裁者也成为中介者,能够想象不少人要去租房,不少人要把房子出租,若是私下里面去商量,既浪费时间,又很难找到对方,经过中介这个对象,它收集了不少的租房和出租房的信息,这样就能很快的找到最适合的房子。因而可知生活就是最好的设计模式。仲裁者模式对于代码的修改(很容易定位错误)、新的成员的加入、代码的复用(组员部分能够复用,仲裁者部分不易复用)都有着必定的简化,将该集中处理的集中起来,将该分散的分散出去,无疑是一种好的设计模式。对比于外观模式Facade,仲裁者须要和组员沟通,是双向的,而外观模式facade角色只是对其余角色进行整合,是单向的。设计模式至今咱们已经研究了16种了,这其中不少设计模式都是有着关联的,一样也有着不一样之处,可是都和实际问题是分不开的,设计模式是实际问题的抽象和解决方法,为了提升可扩展性和组件化,实际问题是设计模式的来源和最终归宿。