调停者模式整理
来源:互联网 发布:用php做购物网站案例 编辑:程序博客网 时间:2024/06/09 17:24
调停者模式:
调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使他们可以较松散地耦合。
定义: 在调停者模式中,所有的成员对象都可以协调工作,但是又不直接相互管理,这些对象都与一个处于中心地位的调停者对象发生紧密的关系,由这个调停者对象进行协调工作。这个协调者对象叫做调停者,而调停者所协调的成员对象称作同事(Colleague)对象。
public abstract class Colleague {
private Mediator mediator;
/**构造函数,作为参数接收调停者对象*/
public Colleague(Mediator m){
mediator = m;
}
/**取值方法,提供调停者对象*/
public Mediator getMediator(){
return mediator;
}
/**行动方法,由子类实现*/
public abstract void action();
/**示意性的商业方法,调用此方法
* 可以改变对象的内部状态
*/
public void change(){
mediator.colleagueChanged(this);
}
}
public class Colleague1 extends Colleague {
/**构造方法,作为参数接收调停者对象*/
public Colleague1(Mediator m) {
super(m);
}
/**行动方法的具体实现*/
@Override
public void action() {
System.out.println("This is an action from Colleague 1");
}
}
public class Colleague2 extends Colleague {
/**构造函数,作为参量接收调停者对象*/
public Colleague2(Mediator m) {
super(m);
}
/**行动方法的具体实现*/
@Override
public void action() {
System.out.println("This is an action from Colleague 2");
}
}
public abstract class Mediator {
/**事件方法, 由子类实现*/
public abstract void colleagueChanged(Colleague c);
public static void main(String args[]){
ConcreteMediator mediator = new ConcreteMediator();
mediator.createConcreteMediator();
Colleague c1 = new Colleague1(mediator);
Colleague c2 = new Colleague2(mediator);
mediator.colleagueChanged(c1);
}
}
public class ConcreteMediator extends Mediator {
private Colleague1 colleague1;
private Colleague2 colleague2;
/**事件方法的具体实现*/
@Override
public void colleagueChanged(Colleague c) {
colleague1.action();
colleague2.action();
}
/**工厂方法,创建同事对象*/
public void createConcreteMediator(){
colleague1 = new Colleague1(this);
colleague2 = new Colleague2(this);
}
/**取值方法,提供同事对象*/
public Colleague1 getColleague1(){
return colleague1;
}
/**取值方法,提供同事对象*/
public Colleague2 getColleague2(){
return colleague2;
}
}
==========下面是另一个版本介绍该模式(摘自《设计模式:java语言中的应用》)-===============
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged(Colleague colleague);
}
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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(checkGuest);
//输出到画面上
pack();
show();
}
/**根据Colleague的消息,判断各Colleague的有效/无效*/
@Override
public void colleagueChanged(Colleague c) {
if(c == checkGuest || c == checkLogin){
if(checkGuest.getState()){ //Guest模式
textUser.setColleagueEnable(false);
textPass.setColleagueEnable(false);
buttonOk.setColleagueEnable(true);
}else{
textUser.setColleagueEnable(true);
userpassChanged();
}
}else if(c == textUser || c == textPass){
userpassChanged();
}else{
System.out.println("colleagueChanged: unknow colleague = " + c);
}
}
/**产生Colleague*/
@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);
}
/**
* textUser或textPass有变动
* 判断各Colleague的有效/无效
*/
private void userpassChanged(){
if(textUser.getText().length() > 0){
textPass.setColleagueEnable(true);
if(textPass.getText().length() > 0){
buttonOk.setColleagueEnable(true);
}else{
buttonOk.setColleagueEnable(false);
}
}else{
textPass.setColleagueEnable(false);
buttonOk.setColleagueEnable(false);
}
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("" + e);
System.exit(0);
}
}
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnable(boolean enabled);
}
public class ColleagueButton extends Button implements Colleague{
private Mediator mediator;
public ColleagueButton(String caption){
super(caption);
}
@Override
public void setColleagueEnable(boolean enabled) {
//Mediator指示有效/无效
setEnabled(enabled);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
}
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague{
private Mediator mediator;
public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state){
super(caption, group, state);
}
@Override
public void setColleagueEnable(boolean enabled) {
//Mediator指示有效/无效
setEnabled(enabled);
}
@Override
public void setMediator(Mediator mediator) {
//保留Mediator
this.mediator = mediator;
}
@Override
public void itemStateChanged(ItemEvent e) {
// 若状态有变,通知Mediator
mediator.colleagueChanged(this);
}
}
import java.awt.Color;
import java.awt.TextField;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
public class ColleagueTextField extends TextField implements TextListener, Colleague{
private Mediator mediator;
public ColleagueTextField(String text, int columns){
super(text, columns);
}
@Override
public void setColleagueEnable(boolean enabled) {
//Mediator指示有效/无效
setEnabled(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
/**保留Mediator*/
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void textValueChanged(TextEvent e) {
//字符串若有变化,则通知Mediator
mediator.colleagueChanged(this);
}
}
- 调停者模式整理
- 调停者模式
- 调停者模式
- 调停者模式
- 调停者模式(Mediator)
- 调停者模式
- JAVA调停者模式
- 调停者模式
- 调停者模式
- 调停者模式Mediator
- 调停者模式(Mediator)
- 调停者模式
- mediator模式-调停者模式
- 设计模式:调停者模式
- 调停者(mediator)模式
- 调停者模式mediator 笔记
- Java调停者模式(Mediator)
- 调停者模式(Mediator)
- 关于vCalendar / to-do / vEvent的区别
- POCO中Event同步对象的POSIX实现
- 关于430与晶振的信息
- 交叉表、行列转换和交叉查询经典
- MFC文档序列化
- 调停者模式整理
- 比较全的fourcc含义
- 虚拟经济的作用
- 时间服务
- 深入理解C++中的mutable关键字
- 妙用Adobe Audition 系列教程(一):信号发生器
- Microwindows 在 MINI2440 QEMU上的移植
- vmware在ubuntu11.04下的问题
- 在ubuntu10.10中安装sun-java5-jdk的方法