@(设计模式)[设计模式, 中介者模式, Mediator]
设计模式学习笔记中介者Mediator模式
基本介绍中介者案例
类图实现代码
Mediator接口Colleague接口ColleagueButton类ColleagueTextField类ColleagueCheckbox类LoginFrame类测试类运行结果 中介者模式中的角色
Mediator仲裁者中介者ConcreteMediator具体的仲裁者中介者Colleague同事ConcreteColleague 具体的同事类图
基本介绍
中介者模式一般用于调整多个对象之间的关系,当对象状态改变时,将信息先传递给中介者,中介者进行处理,再反馈给相应的对象。
中介者案例
类图
实现代码
package com.pc.mediator.example;
/**
* 中介者接口
* Created by Switch on 2017/3/30.
*/
public interface Mediator {
/**
* 创建中介者管理成员
*/
void createColleagues();
/**
* 成员状态改变
*/
void colleagueChanged();
}
Colleague接口
package com.pc.mediator.example;
/**
* 成员接口
* Created by Switch on 2017/3/30.
*/
public interface Colleague {
/**
* 设置中介者
*
* @param mediator 中介者对象
*/
void setMediator(Mediator mediator);
/**
* 设置成员状态
*
* @param enabled 启用true,不启用false
*/
void setColleagueEnabled(
boolean enabled);
}
package com.pc.mediator.example;
import java.awt.Button;
/**
* 按钮成员类
* Created by Switch on 2017/3/30.
*/
public class ColleagueButton extends Button implements Colleague {
/**
* 中介者
*/
private Mediator mediator;
/**
* 构造方法,设置标题
*
* @param caption 标题
*/
public ColleagueButton(String caption) {
super(caption);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(
boolean enabled) {
setEnabled(enabled);
}
}
ColleagueTextField类
package com.pc.mediator.example;
import java.awt.TextField;
import java.awt.Color;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
/**
* 文本域成员类
* Created by Switch on 2017/3/30.
*/
public class ColleagueTextField extends TextField implements TextListener, Colleague {
/**
* 中介者
*/
private Mediator mediator;
/**
* 构造方法,设置文本和字数
*
* @param text 文本
* @param wordNumber 字数
*/
public ColleagueTextField(String text,
int wordNumber) {
super(text, wordNumber);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(
boolean enabled) {
setEnabled(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
/**
* 当文字发生变化时通知Mediator
*
* @param e 文本事件
*/
@Override
public void textValueChanged(TextEvent e) {
mediator.colleagueChanged();
}
}
ColleagueCheckbox类
package com.pc.mediator.example;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
* 复选框成员类
* Created by Switch on 2017/3/30.
*/
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
/**
* 中介者
*/
private Mediator mediator;
/**
* 构造方法,设置复选框标题、组、初始状态
*
* @param caption 标题
* @param group 组
* @param state 初始状态
*/
public ColleagueCheckbox(String caption, CheckboxGroup group,
boolean state) {
super(caption, group, state);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(
boolean enabled) {
setEnabled(enabled);
}
/**
* 当状态发生变化时通知Mediator
*
* @param e 选项事件
*/
@Override
public void itemStateChanged(ItemEvent e) {
mediator.colleagueChanged();
}
}
LoginFrame类
package com.pc.mediator.example;
import java.awt.Frame;
import java.awt.Label;
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.CheckboxGroup;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 登录界面类
* Created by Switch on 2017/3/30.
*/
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;
/**
* 构造方法,设置标题
*
* @param title 标题
*/
public LoginFrame(String title) {
super(title);
setBackground(Color.lightGray);
setLayout(
new GridLayout(
4,
2));
createColleagues();
add(checkGuest);
add(checkLogin);
add(
new Label(
"Username:"));
add(textUser);
add(
new Label(
"Password:"));
add(textPass);
add(buttonOk);
add(buttonCancel);
colleagueChanged();
pack();
show();
}
@Override
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");
checkGuest.setMediator(
this);
checkLogin.setMediator(
this);
textUser.setMediator(
this);
textPass.setMediator(
this);
buttonOk.setMediator(
this);
buttonCancel.setMediator(
this);
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(
this);
buttonCancel.addActionListener(
this);
}
@Override
public void colleagueChanged() {
if (checkGuest.getState()) {
textUser.setColleagueEnabled(
false);
textPass.setColleagueEnabled(
false);
buttonOk.setColleagueEnabled(
true);
}
else {
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);
}
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(
0);
}
}
测试类
package com.pc.mediator.example.test;
import com.pc.mediator.example.LoginFrame;
import org.junit.Test;
/**
* LoginFrame Tester.
*
* @author Switch
* @version 1.0
*/
public class LoginFrameTest {
/**
* 测试中介者模式
*
* @throws InterruptedException 中断异常
*/
@Test
public void testLoginFrame()
throws InterruptedException {
new LoginFrame(
"Mediator Sample");
Thread.sleep(
100000);
}
}
运行结果
中介者模式中的角色
Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。在案例中,由Mediator接口扮演此角色。
ConcreteMediator角色负责实现Mediator角色的接口(API),负责实际做出决定。在案例中,由LoginFrame类扮演此角色。
Colleague(同事)
Colleague角色负责定义与Mediator角色进行通信的接口(API)。在案例中,由Colleague接口扮演此角色。
ConcreteColleague (具体的同事)
ConcreteColleague角色负责实现Colleague角色的接口(API)。在案例中,由ColleagueButton类、ColleagueTextField类和ColleagueCheckbox类扮演此角色。
类图
GitHub:DesignPatternStudy
——————参考《图解设计模式》