1.定義
用一箇中介對象來封裝一系列的對象交互,該中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
2. 角色
- Mediator:抽象中介者
- ConcreteMediator:具體中介者
- Colleague:抽象同事類
- ConcreteColleague:具體同事類
3. 特點
- 優點:可以減少對象之間的交互,使對象解耦,將控制邏輯集中,可以簡化系統的維護。
- 缺點:因爲中介者包含了具體同事之間的交互,若設計不當,可能導致具體中介者類十分複雜。
4. 示例
Mediator:
public abstract class Mediator {
public Map<String, Colleague> map;
public Mediator(){
map = new HashMap<>();
}
public void register(String user, Colleague colleague) {
map.put(user, colleague);
}
public abstract void operation(String receiver, String msg);
}
ConcreteMediator:
public class ConcreteMediator extends Mediator {
@Override
public void operation(String receiver, String msg) {
Colleague colleague = map.get(receiver);
if (colleague != null) {
colleague.receiveMsg(msg);
} else {
System.out.println(receiver + " is not exist");
}
}
}
Colleague:
public abstract class Colleague {
public Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receiveMsg(String msg);
public abstract void sendMsg(String receiver, String msg);
}
具體同事類:
// ConcreteColleagueA
public class ConcreteColleagueA extends Colleague {
@Override
public void receiveMsg(String msg) {
System.out.println("Colleague A receives a message");
System.out.println(msg);
}
@Override
public void sendMsg(String receiver, String msg) {
System.out.println("Colleague A sends a message");
mediator.operation(receiver, msg);
}
}
// ConcreteColleagueB
public class ConcreteColleagueB extends Colleague {
@Override
public void receiveMsg(String msg) {
System.out.println("Colleague B receives a message");
System.out.println(msg);
}
@Override
public void sendMsg(String receiver, String msg) {
System.out.println("Colleague B sends a message");
mediator.operation(receiver, msg);
}
}
測試類:
public class TestMediator {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Colleague colleagueA = new ConcreteColleagueA();
Colleague colleagueB = new ConcreteColleagueB();
colleagueA.setMediator(mediator);
colleagueB.setMediator(mediator);
mediator.register("A", colleagueA);
mediator.register("B", colleagueB);
colleagueA.sendMsg("B","the message is from colleague A");
System.out.println("--------------------------------------------------");
colleagueB.sendMsg("A", "the message is from colleague B");
System.out.println("--------------------------------------------------");
colleagueA.sendMsg("C", "the message is from colleague A");
}
}
// 輸出
// Colleague A sends a message
// Colleague B receives a message
// the message is from colleague A
// --------------------------------------------------
// Colleague B sends a message
// Colleague A receives a message
// the message is from colleague B
// --------------------------------------------------
// Colleague A sends a message
// C is not exist
參考:
1. 《Head First 設計模式》
2. 《圖說設計模式》https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/mediator.html