調停者(Mediator)模式又稱爲中介者模式,包裝了一系列對象相互做用的方式,使得這些對象沒必要互相明顯引用。從而使它們能夠較鬆散的耦合。當這些對象中的某些對象之間的相互做用發生變化時,不會當即影響到其餘的一些對象之間的相互做用。從而保證這些相互做用能夠彼此獨立地變化。java
WTO是一個協調組織,各個貿易地區能夠由WTO進行組織。WTO扮演的正是協調者的角色,它取代了本來由各個地區進行協調和談判的強耦合關係,各個貿易地區加入世界貿易組織前的貿易狀態以下:框架
WTO使得各個貿易地區之間的強關聯關係變爲較爲鬆散的耦合關係, 各個貿易地區加入世界貿易組織的貿易狀態以下:ide
結構以下:測試
涉及到的角色以下:this
抽象調停者(Mediator)角色:定義出同事對象到調停者對象的接口,其中主要方法是一個(或多個)事件方法。
具體調停者(ConcreteMediator)角色:實現了抽象調停者所聲明的事件方法。具體調停者知曉全部的具體同事類,並負責具體的協調各同事對象的交互關係。
抽象同事類(Colleague)角色:定義出調停者到同事對象的接口。同事對象只知道調停者而不知道其他的同事對象。
具體同事類(ConcreteColleague)角色:全部的具體同事類均從抽象同事類繼承而來。實現本身的業務,在須要與其餘同事通訊的時候,就與持有的調停者通訊,調停者會負責與其餘的同事交互。spa
源碼以下:code
抽象調停者:聲明一個抽象方法colleagueChange,這就是所謂的事件方法。當自身的狀態發生變化的時候,一個同事對象能夠調用這個事件方法來通知調停者,從而更新有關的同事對象。對象
package mediator; /** * 抽象調停者 * */ public abstract class AbstractMediator { /** * 同事改變的時候通知調停者,調停者負責與其餘同事交互 * * @param abstractColleague */ public abstract void colleagueChange(AbstractColleague abstractColleague); }
具體調停者:blog
package mediator; /** * 具體調停者 * */ public class ConcreteMediator extends AbstractMediator { private Colleague1 Colleague1; private Colleague2 Colleague2; @Override public void colleagueChange(AbstractColleague abstractColleague) { // 同事改變,協調其餘同事類 } public void setColleague1(Colleague1 colleague1) { Colleague1 = colleague1; } public void setColleague2(Colleague2 colleague2) { Colleague2 = colleague2; } }
抽象同事類:聲明一個action方法,當收到其餘同事類改變後執行這個方法繼承
package mediator; /** * 抽象同事 * */ public abstract class AbstractColleague { private AbstractMediator mediator; public AbstractColleague(AbstractMediator mediator) { super(); this.mediator = mediator; } /** * 具體的行動方法,由子類實現(商業方法) */ public abstract void action(); public void change() { mediator.colleagueChange(this); } public AbstractMediator getMediator() { return mediator; } }
具體同事類:每一個同事僅知道調停者,無需知道其餘同事
package mediator; /** * 具體同事類1 * */ public class Colleague1 extends AbstractColleague { public Colleague1(AbstractMediator mediator) { super(mediator); } @Override public void action() { // 執行操做 System.out.println("Colleague1 action"); // 通知調停者 getMediator().colleagueChange(this); } }
package mediator; /** * 具體同事類2 * */ public class Colleague2 extends AbstractColleague { public Colleague2(AbstractMediator mediator) { super(mediator); } @Override public void action() { // 執行操做 System.out.println("Colleague2 action"); // 通知調停者 getMediator().colleagueChange(this); } }
多個用戶能夠向聊天室發送消息,聊天室向全部的用戶顯示消息。咱們將建立兩個類 ChatRoom 和 User。User 對象使用 ChatRoom 方法來分享他們的消息。ChatRoom 就至關於調停者。
代碼:
ChatRoom:
package mediator; import java.util.Date; public class ChatRoom { public static void showMessage(User user, String message) { System.out.println(new Date().toString() + " [" + user.getName() + "] : " + message); } }
User:
package mediator; public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public User(String name) { this.name = name; } public void sendMessage(String message) { ChatRoom.showMessage(this, message); } }
測試類:
package mediator; public class Client { public static void main(String[] args) { User a = new User("A"); User b = new User("B"); a.sendMessage("Hi! B!"); b.sendMessage("Hello! A!"); } }
結果:
Mon Nov 04 14:35:51 CST 2019 [A] : Hi! B!
Mon Nov 04 14:35:51 CST 2019 [B] : Hello! A!
調停者模式(Mediator Pattern)是用來下降多個對象和類之間的通訊複雜性。這種模式提供了一箇中介類,該類一般處理不一樣類之間的通訊,並支持鬆耦合,使代碼易於維護。中介者模式屬於行爲型模式。
意圖:用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。
主要解決:對象與對象之間存在大量的關聯關係,這樣勢必會致使系統的結構變得很複雜,同時若一個對象發生改變,咱們也須要跟蹤與之相關聯的對象,同時作出相應的處理。
什麼時候使用:多個類相互耦合,造成了網狀結構。
如何解決:將網狀結構分離爲星型結構。
關鍵代碼:對象 Colleague 之間的通訊封裝到一個類中單獨處理。
應用實例: 一、中國加入 WTO 以前是各個國家相互貿易,結構複雜,如今是各個國家經過 WTO 來互相貿易。 二、機場調度系統。 三、MVC 框架,其中C(控制器)就是 M(模型)和 V(視圖)的中介者。
優勢: 一、下降了類的複雜度,將一對多轉化成了一對一。 二、各個類之間的解耦。 三、符合迪米特原則。
缺點:中介者會龐大,變得複雜難以維護。
使用場景: 一、系統中對象之間存在比較複雜的引用關係,致使它們之間的依賴關係結構混亂並且難以複用該對象。 二、想經過一箇中間類來封裝多個類中的行爲,而又不想生成太多的子類。
注意事項:不該當在職責混亂的時候使用。