設計模式——中介者模式
阿新 • • 發佈:2018-03-31
解耦 用戶名 進行 edi 目標 tac visitor 適用場景 行為
中介者模式定義
中介者對象封裝系列的對象交互,中介者使得對象不需要顯示地相互作用,從而松耦合,能夠獨立改變它們之間的交互。中介者模式角色
抽象中介者: 用於各個同事類之間的通信,同事類對象到中介者對象的接口。包括一個或幾個抽象的事件方法,由子類實現。
中介者實現類: 從一個同事類接收消息,通過消息影響其他同事類
同事類: 如果一個對象會影響其他類,同時也會被其他類影響,這兩個類互為同事類。使用中介者模式的原因
一般來說,同事類之間的關系是比較復雜的,多個同事類之間互相關聯時,他們之間的關系會呈現為復雜的網狀結構,這是一種過度耦合的架構,即不利於類的復用,也不穩定。在使用了中介者模式之後,同事類之間關系變成星型結構,由專門的類統一管理他們之間的關系。
UML 圖
- 中介者模式例子
相對於機票購買這件事來說,客戶、各航司、各代理商之間其實就有錯綜復雜。而去哪網的出現目標就是將這些錯綜復雜的關系整合,以去哪兒網平臺為核心,呈現一個星型結構。
public class User { /** * 用戶名稱 */ protected String name; /** * 中介者 */ protected Mediator mediator; public User(String name, Mediator mediator) { this.name = name; this.mediator = mediator; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Mediator getMediator() { return mediator; } public void setMediator(Mediator mediator) { this.mediator = mediator; } }
public class Visitor extends User { public Visitor(String name, Mediator mediator) { super(name, mediator); } /** * 與中介者聯系 * * @param message */ public void constact(String message) { mediator.constact(message, this); } public void getMessage(String message) { System.out.println("訪問者:" + name + ",獲取信息:" + message); } }
public class Agents extends User {
public Agents(String name, Mediator mediator) {
super(name, mediator);
}
/**
* 與中介者聯系
*
* @param message
*/
public void constact(String message) {
mediator.constact(message, this);
}
public void getMessage(String message) {
System.out.println("代理商:" + name + ",獲取信息:" + message);
}
}
public interface Mediator {
void constact(String message,User user);
}
public class MediatorStructure implements Mediator {
/**
* 代理商
*/
private Agents agents;
/**
* 用戶
*/
private Visitor visitor;
public Agents getAgents() {
return agents;
}
public void setAgents(Agents agents) {
this.agents = agents;
}
public Visitor getVisitor() {
return visitor;
}
public void setVisitor(Visitor visitor) {
this.visitor = visitor;
}
public void constact(String message, User user) {
//如果是代理商,則訪問者獲得信息
if (user == agents) {
visitor.getMessage(message);
} else {
agents.getMessage(message);
}
}
}
public class Client {
public static void main(String[] args) {
MediatorStructure mediator = new MediatorStructure();
Agents agents = new Agents("xxx機票代理商", mediator);
Visitor visitor = new Visitor("李四", mediator);
mediator.setAgents(agents);
mediator.setVisitor(visitor);
agents.constact("聽說便宜機票.....");
visitor.constact("是的,需要機票嗎?");
}
}
優點
1、 簡化了對象之間的關系,將系統的各個對象之間的相互關系進行封裝,將各個同事類解耦,使系統成為松耦合系統。2、 減少了子類的生成。
3 、 可以減少各同事類的設計與實現。
缺點
由於中介者對象封裝了系統中對象之間的相互關系,導致其變得非常復雜,使得系統維護比較困難。適用場景
1、 系統中對象之間存在比較復雜的引用關系,導致他們之間的依賴關系結構混亂而且難以復用該對象。2、 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。
設計模式——中介者模式