您的位置:首页 > 编程语言 > Java开发

设计模式(十六)-中介者模式(Mediator Pattern)——只有一个仲裁者

2018-02-07 09:39 555 查看
中介者模式(Mediator Pattern)中,组员向仲裁者报告,仲裁者向组员下达指示。

Mediator.java

package com.test.dp.Mediator.Sample;

//定义“仲裁者”的接口(API)的接口
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged();
}
Colleague.java

package com.test.dp.Mediator.Sample;

//定义“组员”的接口(API)的接口
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnabled(boolean enabled);
}
ColleagueButton.java

package com.test.dp.Mediator.Sample;

import java.awt.Button;

//表示按钮的类。实现了Colleague接口
public class ColleagueButton extends Button implements Colleague {
private Mediator mediator;
public ColleagueButton(String caption) {
super(caption);
}
public void setMediator(Mediator mediator) {            // 保存Mediator
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {      // Mediator下达启用/禁用的指示
setEnabled(enabled);
}
}
ColleagueTextField.java

package com.test.dp.Mediator.Sample;

import java.awt.TextField;
import java.awt.Color;
import java.awt.event.TextListener;
import java.awt.event.TextEvent;

//表示文本输入框的类。实现了Colleague接口
public class ColleagueTextField extends TextField implements TextListener, Colleague {
private Mediator mediator;
public ColleagueTextField(String text, int columns) {   // 构造函数
super(text, columns);
}
public void setMediator(Mediator mediator) {            // 保存Mediator
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {      // Mediator下达启用/禁用的指示
setEnabled(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
public void textValueChanged(TextEvent e) {             // 当文字发生变化时通知Mediator
mediator.colleagueChanged();
}
}
ColleagueCheckbox.java

package com.test.dp.Mediator.Sample;

import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

//表示勾选框(此处时单选按钮)的类。实现了Colleague接口
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
private Mediator mediator;
public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {  // 构造函数
super(caption, group, state);
}
public void setMediator(Mediator mediator) {            // 保存Mediator
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {      // Mediator下达启用/禁用指示
setEnabled(enabled);
}
public void itemStateChanged(ItemEvent e) {             // 当状态发生变化时通知Mediator
mediator.colleagueChanged();
}
}
LoginFrame.java

package com.test.dp.Mediator.Sample;

import java.awt.Frame;
import java.awt.Label;
import java.awt.Color;
import java.awt.CheckboxGroup;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

//表示登录对话框的类。实现了Mediator接口
public class LoginFrame extends Frame implements ActionListener, Mediator {
private ColleagueCheckbox checkGuest;
private ColleagueCheckbox checkLogin;
private ColleagueTextField textUser;
private ColleagueTextField textPass;
private ColleagueButton buttonOk;
private ColleagueButton buttonCancel;

// 构造函数。
// 生成并配置各个Colleague后,显示对话框。
public LoginFrame(String title) {
super(title);
setBackground(Color.lightGray);
// 使用布局管理器生成4×2窗格
setLayout(new GridLayout(4, 2));
// 生成各个Colleague
createColleagues();
// 配置
add(checkGuest);
add(checkLogin);
add(new Label("Username:"));
add(textUser);
add(new Label("Password:"));
add(textPass);
add(buttonOk);
add(buttonCancel);
// 设置初始的启用起用/禁用状态
colleagueChanged();
// 显示
pack();
show();
}

// 生成各个Colleague。
public void createColleagues() {
// 生成
CheckboxGroup g = new CheckboxGroup();
checkGuest = new ColleagueCheckbox("Guest", g, true);
checkLogin = new ColleagueCheckbox("Login", g, false);
textUser = new ColleagueTextField("", 10);
textPass = new ColleagueTextField("", 10);
textPass.setEchoChar('*');
buttonOk = new ColleagueButton("OK");
buttonCancel = new ColleagueButton("Cancel");
// 设置Mediator
checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);
// 设置Listener
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}

// 接收来自于Colleage的通知然后判断各Colleage的启用/禁用状态。
public void colleagueChanged() {
if (checkGuest.getState()) { // Guest mode
textUser.setColleagueEnabled(false);
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(true);
} else { // Login mode
textUser.setColleagueEnabled(true);
userpassChanged();
}
}
// 当textUser或是textPass文本输入框中的文字发生变化时
// 判断各Colleage的启用/禁用状态
private void userpassChanged() {
if (textUser.getText().length() > 0) {
textPass.setColleagueEnabled(true);
if (textPass.getText().length() > 0) {
buttonOk.setColleagueEnabled(true);
} else {
buttonOk.setColleagueEnabled(false);
}
} else {
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(false);
}
}
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(0);
}
}
Main.java

package com.test.dp.Mediator.Sample;

import java.awt.*;
import java.awt.event.*;

public class Main {
static public void main(String args[]) {
new LoginFrame("Mediator Sample");
}
}
执行结果:



总结:

应用实例:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。2、机场调度系统。3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点:1、降低了类的复杂度,将一对多转化成了一对一。2、各个类之间的解耦。3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

使用场景:1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息