調停者模式

  調停者(Mediator)模式又稱爲中介者模式,包裝了一系列對象相互做用的方式,使得這些對象沒必要互相明顯引用。從而使它們能夠較鬆散的耦合。當這些對象中的某些對象之間的相互做用發生變化時,不會當即影響到其餘的一些對象之間的相互做用。從而保證這些相互做用能夠彼此獨立地變化。java

0.中國加入WTO的例子

  WTO是一個協調組織,各個貿易地區能夠由WTO進行組織。WTO扮演的正是協調者的角色,它取代了本來由各個地區進行協調和談判的強耦合關係,各個貿易地區加入世界貿易組織前的貿易狀態以下:框架

  WTO使得各個貿易地區之間的強關聯關係變爲較爲鬆散的耦合關係, 各個貿易地區加入世界貿易組織的貿易狀態以下:ide

 

1.結構

結構以下:測試

 

涉及到的角色以下: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);
    }

}

 

2.簡單的聊天室案例

  多個用戶能夠向聊天室發送消息,聊天室向全部的用戶顯示消息。咱們將建立兩個類 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!

 

3.總結

  調停者模式(Mediator Pattern)是用來下降多個對象和類之間的通訊複雜性。這種模式提供了一箇中介類,該類一般處理不一樣類之間的通訊,並支持鬆耦合,使代碼易於維護。中介者模式屬於行爲型模式。

意圖:用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。

主要解決:對象與對象之間存在大量的關聯關係,這樣勢必會致使系統的結構變得很複雜,同時若一個對象發生改變,咱們也須要跟蹤與之相關聯的對象,同時作出相應的處理。

什麼時候使用:多個類相互耦合,造成了網狀結構。

如何解決:將網狀結構分離爲星型結構。

關鍵代碼:對象 Colleague 之間的通訊封裝到一個類中單獨處理。

應用實例: 一、中國加入 WTO 以前是各個國家相互貿易,結構複雜,如今是各個國家經過 WTO 來互相貿易。 二、機場調度系統。 三、MVC 框架,其中C(控制器)就是 M(模型)和 V(視圖)的中介者。

優勢: 一、下降了類的複雜度,將一對多轉化成了一對一。 二、各個類之間的解耦。 三、符合迪米特原則。

缺點:中介者會龐大,變得複雜難以維護。

使用場景: 一、系統中對象之間存在比較複雜的引用關係,致使它們之間的依賴關係結構混亂並且難以複用該對象。 二、想經過一箇中間類來封裝多個類中的行爲,而又不想生成太多的子類。

注意事項:不該當在職責混亂的時候使用。

相關文章
相關標籤/搜索