設計模式學習筆記——中介者(Mediator)模式
@(設計模式)[設計模式, 中介者模式, Mediator]
基本介紹
中介者模式一般用於調整多個對象之間的關係,當對象狀態改變時,將信息先傳遞給中介者,中介者進行處理,再反饋給相應的對象。
中介者案例
類圖
實現代碼
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
——————參考《圖解設計模式》