中介者模式(Mediator)
用一個中介對象來封裝一系列對象的交互,中介者使各對象不需要顯式地互相調用,而是通過中介者。達到解耦及獨立變化(只影響到中介者)。
也叫:調停者模式
中介者模式.png
優缺點:
-
優點:
ConcreteCollegue 之間解耦,獨立變化(只影響中介者) 各對象之間由:網狀結構-->星狀結構 對象之間通過中介者間接發生關系
-
缺點:
中介者的責任太重,需要知道所有的具體對象。 對象之間的關系需要通過中介者來調用,導致中介者邏輯會越來越復雜。
應用場景
適用于存在一系列類似功能的組件,而組件不能過多。例如:
- 例如計算器的按鍵
- 各個國家和聯合國
沒有聯合國之前.png
有了聯合國后.png
中介者模式實現
中介者模式.png
調用流程.png
目錄結構.png
- Mediator
public abstract class Mediator {
public abstract void expressDeclare(String msg, Country countrt);
}
- Country
public abstract class Country {
protected Mediator mediator;
public Country(Mediator m) {
this.mediator = m;
}
public abstract void makeDeclere();
public abstract void express(String msg);
}
- ConcreteMediator
public class ConcreteMediator extends Mediator {
public USA usa;
public Iraq iraq;
@Override
public void expressDeclare(String msg, Country country) {
if (country == this.usa) {
usa.express(msg);
} else if (country == this.iraq) {
iraq.express(msg);
}
}
}
- Iraq
public class Iraq extends Country {
public Iraq(Mediator m) {
super(m);
}
@Override
public void makeDeclere() {
mediator.expressDeclare("我不隨便搞事情", this);
}
@Override
public void express(String msg) {
System.out.println(msg);
}
}
- USA
public class USA extends Country {
public USA(Mediator m) {
super(m);
}
@Override
public void makeDeclere() {
mediator.expressDeclare("我是老大,隨便你怎么搞", this);
}
@Override
public void express(String msg) {
System.out.println(msg);
}
}
- Client
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
Iraq iraq = new Iraq(mediator);
USA usa = new USA(mediator);
mediator.iraq = iraq;
mediator.usa = usa;
iraq.makeDeclere();
usa.makeDeclere();
}
}
參考:
- 《大話設計模式》 第三版
- 《android源碼設計模式》