您的位置:首页 > 其它

设计模式学习笔记——中介者(Mediator)模式

2017-04-13 10:40 891 查看

设计模式学习笔记——中介者(Mediator)模式

@(设计模式)[设计模式, 中介者模式, Mediator]

设计模式学习笔记中介者Mediator模式
基本介绍

中介者案例
类图

实现代码
Mediator接口

Colleague接口

ColleagueButton类

ColleagueTextField类

ColleagueCheckbox类

LoginFrame类

测试类

运行结果

中介者模式中的角色
Mediator仲裁者中介者

ConcreteMediator具体的仲裁者中介者

Colleague同事

ConcreteColleague 具体的同事

类图

基本介绍

中介者模式一般用于调整多个对象之间的关系,当对象状态改变时,将信息先传递给中介者,中介者进行处理,再反馈给相应的对象。

中介者案例

类图



实现代码

Mediator接口

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);
}


ColleagueButton类

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);
// 使用布局管理器生成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();
}

@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");
// 设置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);
}

@Override
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);
}
}

@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(仲裁者、中介者)

Mediator
角色负责定义与
Colleague
角色进行通信和做出决定的接口(
API
)。在案例中,由
Mediator
接口扮演此角色。

ConcreteMediator(具体的仲裁者、中介者)

ConcreteMediator
角色负责实现
Mediator
角色的接口(
API
),负责实际做出决定。在案例中,由
LoginFrame
类扮演此角色。

Colleague(同事)

Colleague
角色负责定义与
Mediator
角色进行通信的接口(
API
)。在案例中,由
Colleague
接口扮演此角色。

ConcreteColleague (具体的同事)

ConcreteColleague
角色负责实现
Colleague
角色的接口(
API
)。在案例中,由
ColleagueButton
类、
ColleagueTextField
类和
ColleagueCheckbox
类扮演此角色。

类图



GitHub:DesignPatternStudy

——————参考《图解设计模式》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息