設計模式-中介者模式

設計模式-中介者模式

定義

用一箇中介對象封裝一系列的對象交互,中介者使各對象不須要顯示地相互做用,從而使其耦合鬆散,並且能夠獨立地改變它們之間
的交互
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();
	}
}

擴展

使用場景

若是隻是簡單的一個對象依賴多個對象就考慮採用中介者模式的話,頗有可能形成中介者模式的實現很是複雜,並且只是邏輯轉移到
中介者身上的狀況下,未必能把原有的負責邏輯理清楚。

中介者模式使用於多個對象緊密耦合的狀況。那緊密耦合的標準是什麼?
若是在類圖中出現了蜘蛛網的結構。
在這種狀況下必定要採用中介者模式,把本來的網狀結構梳理成星狀結構,使本來負責的邏輯關係變得清晰。

常見應用

  • 機場調度中心
  • MVC框架
  • 中介服務
相關文章
相關標籤/搜索