Mediator模式(仲裁者設計模式)
阿新 • • 發佈:2018-12-17
Mediator ?
Mediator的意思是“仲裁者”“中介者”。一方面,當發生麻煩事情的時候,通知仲裁者;當發生涉及全體組員的事情時,也通知仲裁者。當仲裁者下達指示時,組員會立即執行。團隊組員之間不再互相溝通並私自做出決定,而是發生任何事情都向仲裁者報告。另一方面,仲裁者站在整個團隊的角度上對組員上報的事情做出決定。這就是Mediator模式。
概述: 他們(構件)各自與仲裁者通訊。然後,將控制顯示的邏輯處理交給仲裁者負責。(解決了原來邏輯分散的程式碼邏輯,控制流程比較清晰)
理清職責
|名字======》》》》說明 Mediator定義“|| 仲裁者”的介面(API)的介面 colleague ||定義“組員”的介面(APl)的介面 colleagueButton || 表示按鈕的類。它實現了Colleague介面 |ColleagueTextField || 表示文字輸入框的類。它實現了Colleague介面 colleaguecheckbox || 表示勾選框(此處是單選按鈕)的類。它實現了Colleague介面 LoginFrame || 表示登入對話方塊的類。它實現了Mediator介面 |Main || 測試程式行為的類
- 實現功能 1.如果選擇作為遊客訪問,那麼禁用使用者名稱輸入框和密碼輸入框,使使用者無法輸入·如果選擇作為使用者登入,那麼啟用使用者名稱輸入框和密碼輸入框,使使用者可以輸入 2.如果在使用者名稱輸入框中一個字元都沒有輸入,那麼禁用密碼輸入框,使使用者無法輸入密碼 3.如果在使用者名稱輸入框中輸入了至少一個字元,那麼啟用密碼輸入框,使使用者可以輸入密碼(當然,如果選擇作為遊客訪問,那麼密碼框依然是禁用狀態) 4.只有當用戶名輸入框和密碼輸入框中都至少輸入一個字元後,OK按鈕才處於啟用狀態,可以被按下。使用者名稱輸入框或密碼輸入框中一個字元都沒有被輸入的時候,禁用OK按鈕,使其不可被按下(當然,如果選擇作為遊客訪問,那麼OK按鈕總是處於啟用狀態) 5.Cancel按鈕總是處於啟用狀態,任何時候都可以按下該按鈕
UML
時序圖:
Code
- Mediator,Colleague
public interface Colleague { /** * ColleagueButton、ColleaqueTextField、ColleagueCheckbox 拿到Mediator例項的辦法 * @param mediator */ void setMediator(Mediator mediator); /** * 控制組員的狀態的方法;(前提是元件必須有這個控制器方法, * 但是在一般的GUI開發中 ,元件維護都有相應的處理辦法) * 注意:如果組員有更多的狀態,需要定義更多的方法 * @param enabled */ void setColleagueEnabled(boolean enabled); } public interface Mediator { /** * 生成需要管理的組員 */ void createColleagues(); /** * 組員向仲裁者進行報告 */ void colleagueChanged(); }
- ColleagueButton ,ColleagueTextField ,ColleagueCheckBox
public class ColleagueTextField extends TextField implements Colleague, TextListener {
private Mediator mediator;
public ColleagueTextField(String text, int columns) {
super(text, columns);
}
@Override
public void textValueChanged(TextEvent e) {
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator=mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
public class ColleagueCheckBox extends JRadioButton implements ItemListener,Colleague {
private Mediator mediator;
public ColleagueCheckBox(String text, boolean selected) {
super(text, selected);
}
@Override
public void itemStateChanged(ItemEvent e) {
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator=mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
public class ColleagueButton extends JButton implements Colleague {
private Mediator mediator;
public ColleagueButton(String text) {
super(text);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator=mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
- LoginFrame
public class LoginFrame extends JFrame implements ActionListener,Mediator {
private ColleagueCheckBox checkGuest;
private ColleagueCheckBox checkLogin;
private ColleagueTextField textUser;
private ColleagueTextField textPass;
private ColleagueButton buttonok;
private ColleagueButton buttonCancel;
public LoginFrame(String title) throws HeadlessException {
super(title);
setBackground(Color.LIGHT_GRAY);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(4,2));
createColleagues();
add(checkGuest);
add(checkLogin);
add(new JLabel("UserName"));
add(textUser);
add(new JLabel("PassWord"));
add(textPass);
add(buttonok);
add(buttonCancel);
colleagueChanged();
pack();
setEnabled(true);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(0);
}
@Override
public void createColleagues() {
ButtonGroup group = new ButtonGroup();
checkGuest=new ColleagueCheckBox("Guest",true);
checkLogin=new ColleagueCheckBox("Login",false);
group.add(checkGuest);
group.add(checkLogin);
textUser=new ColleagueTextField("",10);
textPass=new ColleagueTextField("",10);
textPass.setEchoChar('*');
buttonCancel=new ColleagueButton("Cancel");
buttonok=new ColleagueButton("OK");
// set Mediator
checkLogin.setMediator(this);
checkGuest.setMediator(this);
textPass.setMediator(this);
textUser.setMediator(this);
buttonok.setMediator(this);
buttonCancel.setMediator(this);
// set 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.isSelected()){
textPass.setEnabled(false);
textUser.setEnabled(false);
buttonok.setEnabled(false);
}else{
textUser.setColleagueEnabled(true);
userpassChanged();
}
}
private void userpassChanged() {
if(textUser.getText().length()>0){
textPass.setEnabled(true);
if(textPass.getText().length()>0){
buttonok.setEnabled(true);
}else{
buttonok.setEnabled(false);
}
}else{
textPass.setEnabled(false);
buttonok.setEnabled(false);
}
}
}
public class MainT {
public static void main(String[] args) {
LoginFrame frame = new LoginFrame("Login Test");
frame.show();
}
}