描述
????中介者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯引用。從而使它們可以較松散地耦合。當這些對象中的某些對象之間的相互作用發(fā)生改變時,不會立即影響到其他的一些對象之間的相互作用。從而保證這些相互作用可以彼此獨立地變化。
簡介
????定義一個中介對象來封裝一系列對象之間的交互,使原有對象之間的耦合松散,且可以獨立地改變它們之間的交互。中介者模式又叫調(diào)停模式,它是迪米特法則的典型應用。

中介者類圖
角色
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事對象注冊與轉(zhuǎn)發(fā)同事對象信息的抽象方法。
- 具體中介者(ConcreteMediator)角色:實現(xiàn)中介者接口,定義一個 List 來管理同事對象,協(xié)調(diào)各個同事角色之間的交互關系,因此它依賴于同事角色。
- 抽象同事類(Colleague)角色:定義同事類的接口,保存中介者對象,提供同事對象交互的抽象方法,實現(xiàn)所有相互影響的同事類的公共功能。
- 具體同事類(Concrete Colleague)角色:是抽象同事類的實現(xiàn)者,當需要與其他同事對象交互時,由中介者對象負責后續(xù)的交互。
優(yōu)缺點
優(yōu)點
- 降低了對象之間的耦合性,使得對象易于獨立地被復用。
- 將對象間的一對多關聯(lián)轉(zhuǎn)變?yōu)橐粚σ坏年P聯(lián),提高系統(tǒng)的靈活性,使得系統(tǒng)易于維護和擴展。
缺點
- 當同事類太多時,中介者的職責將很大,它會變得復雜而龐大,以至于系統(tǒng)難以維護。
使用場景
- 當對象之間存在復雜的網(wǎng)狀結(jié)構(gòu)關系而導致依賴關系混亂且難以復用時。
- 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。
示例
/**
* 抽象中介者(Mediator)角色
*/
public abstract class Mediator {
public abstract void register(Colleague colleague);
public abstract void relay(Colleague colleague);
}
/**
* 具體中介者(ConcreteMediator)角色
*/
public class ConcreteMediator extends Mediator {
private List<Colleague> colleagues = new ArrayList<Colleague>();
@Override
public void register(Colleague colleague) {
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
colleague.setMediator(this);
}
}
@Override
public void relay(Colleague colleague) {
for (Colleague object : colleagues) {
if (!object.equals(colleague)) {
object.receive();
}
}
}
}
/**
* 抽象同事類(Colleague)角色
*/
public abstract class Colleague {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive();
public abstract void send();
}
/**
* 具體同事類(Concrete Colleague)角色
*/
public class ConcreteColleagueA extends Colleague {
@Override
public void receive() {
System.out.println("具體同事類A收到請求。");
}
@Override
public void send() {
System.out.println("具體同事類A發(fā)出請求。");
mediator.relay(this);
}
}
/**
* 具體同事類(Concrete Colleague)角色
*/
public class ConcreteColleagueB extends Colleague {
@Override
public void receive() {
System.out.println("具體同事類B收到請求。");
}
@Override
public void send() {
System.out.println("具體同事類B發(fā)出請求。");
mediator.relay(this);
}
}
/**
* 客戶端角色
*/
public class Client {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Colleague colleagueA, colleagueB;
colleagueA = new ConcreteColleagueA();
colleagueB = new ConcreteColleagueB();
mediator.register(colleagueA);
mediator.register(colleagueB);
colleagueA.send();
colleagueB.send();
}
}