组员向仲裁者报告,仲裁者向组员下达指示。组员之间不再相互询问和相互指示。
示例
一个GUI应用程序,它展示了一个登录对话框,用户在其中输入正确的用户名和密码后可以登录。
可以选择作为游客访问(Guest)或是作为用户登录(Login)
作为用户登录时,需要输入正确的用户名(Username)和密码(Password)
点击OK按钮可以登录,点击Cancel按钮可以取消登录
类图
时序图
1 2 3 4
public interface { public abstract void createColleagues () ; public abstract void colleagueChanged () ; }
Colleague接口
1 2 3 4
public interface Colleague { public abstract void setMediator (Mediator mediator) ; public abstract void setColleagueEnabled (boolean enabled) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import java.awt.*;public class ColleagueButton extends Button implements Colleague { private Mediator mediator; public ColleagueButton (String caption) { super (caption); } public void setMediator (Mediator mediator) { this .mediator = mediator; } public void setColleagueEnabled (boolean enabled) { setEnabled(enabled); } }
ColleagueTextField类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
import java.awt.*;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); } public void setMediator (Mediator mediator) { this .mediator = mediator; } public void setColleagueEnabled (boolean enabled) { setEnabled(enabled); setBackground(enabled ? Color.white : Color.lightGray); } public void textValueChanged (TextEvent e) { mediator.colleagueChanged(); } }
ColleagueCheckbox类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
import java.awt.*;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 setMediator (Mediator mediator) { this .mediator = mediator; } @Override public void setColleagueEnabled (boolean enabled) { setEnabled(enabled); } @Override public void itemStateChanged (ItemEvent e) { mediator.colleagueChanged(); } }
LoginFrame类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class LoginFrame extends Frame implements ActionListener , { private ColleagueCheckbox checkGuest; private ColleagueCheckbox checkLogin; private ColleagueTextField textUser; private ColleagueTextField textPass; private ColleagueButton buttonOk; private ColleagueButton buttonCancel; 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(); } } 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 ); } }
Main类
1 2 3 4 5 6
public class Main { public static void main (String[] args) { new LoginFrame("Mediator Sample" ); } }
运行结果
登场角色
Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。在示例程序中,由Mediator接口扮演此角色。
ConcreteMediator角色负责实现Mediator角色的接口(API),负责实际做出决定。在示例程序中,由LoginFrame类扮演此角色。
Colleague(同事)
Colleague角色负责定义与Mediator角色进行通信的接口(API)。在示例程序中,由Colleague接口扮演此角色。
ConcreteColleague(具体的同事)
ConcreteColleague角色负责实现Colleague角色的接口(API)。在示例程序中,由ColleagueButton类、ColleagueTextField类和ColleagueCheckbox类扮演此角色。
类图
原文:大专栏 【图解设计模式】Mediator模式