中介者模式(Mediator)的定義
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
中介者模式(Mediator)的適用性
1.一組對象以定義良好但是復雜的方式進行通信,產生的相互依賴關系結構混亂且難以理解。
2.一個對象引用其他很多對象並且直接與這些對象通信,導致難以復用該對象。
3.想定制一個分布在多個類中的行為,但又不想生成太多的子類。
中介者模式(Mediator)的參與者
1.Mediator
中介者定義一個接口用於與各同事(Colleague)對象通信。
2.ConcreteMediator
具體中介者通過協調各同事對象實現協作行為,了解並維護它的各個同事。
3.Colleague:
抽象同事類。
4.Colleagueclass
具體同事類。每個具體同事類都只需要知道自己的行為即可,但是他們都需要認識中介者
中介者模式的UML類圖
具體代碼實現:
第一步:定義Mediator
//定義抽象Mediator,可以與同時們進行聯絡
public abstract class Mediator {
public abstract void contact(String content,Colleague coll);
}
第二步:定義抽象Colleague
public class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
第三步:定義具體Colleagueclass
public class ColleagueA extends Colleague {
// 具體同事類繼承自Colleague,此刻就可以與中介者mediator進行通信了
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("同事A"+name+"獲得信息"+message);
}
//同事A與中介者通信
public void contact(String message){
mediator.contact(message, this);
}
}
public class ColleagueB extends Colleague {
public ColleagueB(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("同事B"+name+"獲得信息"+message);
}
//同事B與中介者通信
public void contact(String message){
mediator.contact(message, this);
}
}
第四步:定義具體中介者ConcreteMediator,具體中介者通過協調各同事對象實現協作行為,了解並維護它的各個同事。
//定義具體中介者ConcreteMediator,具體中介者通過協調各同事對象實現協作行為,了解並維護它的各個同事。
public class ConcreteMediator extends Mediator {
ColleagueA collA;
ColleagueB collB;
public ColleagueA getCollA() {
return collA;
}
public void setCollA(ColleagueA collA) {
this.collA = collA;
}
public ColleagueB getCollB() {
return collB;
}
public void setCollB(ColleagueB collB) {
this.collB = collB;
}
@Override
public void contact(String content, Colleague coll) {
if (coll==collA) {
collB.getMessage(content);
} else {
collA.getMessage(content);
}
}
}
第五步:定義Client,測試中介者模式的使用
public class Client {
/**
* @param args
*/
// 中介者,ColleagueA、ColleagueB
public static void main(String[] args) {
// 定義中介者
ConcreteMediator mediator = new ConcreteMediator();
// 定義具體同事類
ColleagueA colleagueA = new ColleagueA("張三", mediator);
ColleagueB colleagueB = new ColleagueB("李四", mediator);
// 中介者知曉每一個具體的Colleague類
mediator.setCollA(colleagueA);
mediator.setCollB(colleagueB);
colleagueA.contact("我是A,我要和同事B說說工作的事情");
colleagueB.contact("我是B,我下午有時間,下午商量吧");
}
}
運行結果:
同事B李四獲得信息:我是A,我要和同事B說說工作的事情
同事A張三獲得信息:我是B,我下午有時間,下午商量吧
總結:
中介者就是一個處於眾多對象中間,並恰當地處理眾多對象之間相互之間的聯系的角色。以上代碼中只有兩個參與者類,但是這些我們都可以根據中介者模式的宗旨進行適當地擴展,即增加參與者類,然后中介者就得擔負更加重的任務了,我們看到上面具體中介者類Mediator中的方法比較多而且有點亂。 所以,在解耦參與者類之間的聯系的同時,中介者自身也不免任務過重,因為幾乎所有的業務邏輯都交代到中介者身上了,可謂是“萬眾期待”的一個角色了。這就是中介者模式的不足之處了。此外,上面這個代碼例子的參與者的屬性和方法都是一樣的,我們可以抽取一個抽象類出來,減少代碼,但是有時候我們根本抽取不了多個“參與者”之間的共性來形成一個抽象類,這也大大增加了中介者模式的使用難度。
