設計模式-中介者模式
定義
用一箇中介對象封裝一系列的對象交互,中介者使各對象不須要顯示地相互做用,從而使其耦合鬆散,並且能夠獨立地改變它們之間
的交互
UML

組成部分主要包含 Mediator抽象中介角色、ConcreteMediator 具體的中介角色、Colleague 同事(功能)角色
· Mediator 抽象中介角色:定義統一的接口,用於同事角色之間的通訊
· ConcreteMediator 具體的中介角色:具體協調各個同事角色的協做行爲,它必須依賴被協調的同事角色
· Colleague 同事角色:與其它同事角色通訊必須依賴中介者角色,每一個同事類角色行爲分爲兩種:
1,自發行爲:改變自己的狀態以及處理自己的邏輯,不與任何終結者角色或同事角色交互的行爲
2,依賴行爲:必須依賴中介者角色才能完成的行爲
優勢
減小依賴,把原來一對多的依賴變成了一對一的依賴,下降了耦合,符合迪米特法則,分佈式系統中的應用抽象也能夠這麼作
缺點
業務複雜以後中介者會膨脹的很是快,若是是在單系統中此時能夠拆分爲多個應用中介,分佈式系統中能夠抽出更細力度的中介模型
實現
public abstract class AbstractMediator {
private Colleague1 colleague1;
private Colleague2 colleague2;
public AbstractMediator() {
}
public AbstractMediator(Colleague1 colleague1, Colleague2 colleague2) {
this.colleague1 = colleague1;
this.colleague2 = colleague2;
}
protected Colleague1 getColleague1() {
return colleague1;
}
public void setColleague1(Colleague1 colleague1) {
this.colleague1 = colleague1;
}
protected Colleague2 getColleague2() {
return colleague2;
}
public void setColleague2(Colleague2 colleague2) {
this.colleague2 = colleague2;
}
public abstract void doSomeThing1();
public abstract void doSomeThing2();
}
public class ConcreteMediator extends AbstractMediator {
public ConcreteMediator() {
super();
}
public ConcreteMediator(Colleague1 colleague1, Colleague2 colleague2) {
super(colleague1, colleague2);
}
@Override
public void doSomeThing1() {
this.getColleague1().doSomething1();
}
@Override
public void doSomeThing2() {
this.getColleague2().doSomeThing2();
}
}
public class Colleague1 {
private AbstractMediator abstractMediator;
public Colleague1(AbstractMediator abstractMediator){
this.abstractMediator = abstractMediator;
}
public void doSomething1(){
System.out.println("同事1完成的事1");
}
public void doSomeThingNeedAssist(){
System.out.println("同事1處理須要中介協助的事情");
this.abstractMediator.doSomeThing2();
}
}
public class Colleague2 {
private AbstractMediator abstractMediator;
public Colleague2(AbstractMediator abstractMediator) {
this.abstractMediator = abstractMediator;
}
public void doSomeThing2(){
System.out.println("同事2完成事2");
}
public void doSomeThingNeedAssist(){
System.out.println("同事2處理須要中介協助的事情");
this.abstractMediator.doSomeThing1();
}
}
public class Client {
public static void main(String[] args) {
AbstractMediator abstractMediator = new ConcreteMediator();
Colleague1 colleague1 = new Colleague1(abstractMediator);
Colleague2 colleague2 = new Colleague2(abstractMediator);
abstractMediator.setColleague1(colleague1);
abstractMediator.setColleague2(colleague2);
colleague1.doSomeThingNeedAssist();
// colleague2.doSomeThingNeedAssist();
}
}
擴展
使用場景
若是隻是簡單的一個對象依賴多個對象就考慮採用中介者模式的話,頗有可能形成中介者模式的實現很是複雜,並且只是邏輯轉移到
中介者身上的狀況下,未必能把原有的負責邏輯理清楚。
中介者模式使用於多個對象緊密耦合的狀況。那緊密耦合的標準是什麼?
若是在類圖中出現了蜘蛛網的結構。
在這種狀況下必定要採用中介者模式,把本來的網狀結構梳理成星狀結構,使本來負責的邏輯關係變得清晰。
常見應用