1. 程式人生 > 實用技巧 >設計模式 | 中介者模式/調停者模式(Mediator)

設計模式 | 中介者模式/調停者模式(Mediator)

定義:

用一箇中介物件來封裝以系列的物件互動。中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地變化他們之間的互動。

結構:(書中圖,侵刪)

一個抽象中介者 若干具體中介者 一個抽象同事類 若干個具體同事類

例項:

我覺得git就相當於一箇中介者,使用者之間不用互相認識,但是可以互相改程式碼。 抽象中介介面:
package designpattern.mediator;

public interface Mediator {
    public void commit(String memo, User sender);
}

使用者類(抽象同事類):

package
designpattern.mediator; public abstract class User { protected Mediator mediator; public User(Mediator mediator) { this.mediator = mediator; } }

倉庫所有者類(具體同事類):

package designpattern.mediator;

public class Owner extends User {
    public Owner(Mediator mediator) {
        super
(mediator); } public void commit(String memo) { mediator.commit(memo, this); } public void receive(String memo) { System.out.println("所有者收到資訊:" + memo); } }

開發者類(具體同事類):

package designpattern.mediator;

public class Developer extends User {

    public Developer(Mediator mediator) {
        
super(mediator); } public void commit(String memo) { mediator.commit(memo, this); } public void receive(String memo) { System.out.println("開發者收到資訊:" + memo); } }

GitHub類(具體中介者類):

package designpattern.mediator;

public class GitHub implements Mediator {
    Owner owner;
    Developer developer;

    public void setOwner(Owner owner) {
        this.owner = owner;
    }

    public void setDeveloper(Developer developer) {
        this.developer = developer;
    }

    @Override
    public void commit(String memo, User sender) {
        if (sender == owner) {
            developer.receive(memo);
        } else {
            owner.receive(memo);
        }
    }

}

客戶端:

package designpattern.mediator;

public class Client {
    public static void main(String[] args) {
        GitHub gitHub = new GitHub();
        Owner owner = new Owner(gitHub);
        Developer developer = new Developer(gitHub);
        gitHub.setOwner(owner);
        gitHub.setDeveloper(developer);

        owner.commit("我新建了一個專案");
        developer.commit("我幫你改了一個BUG");
    }

}

結果輸出:

開發者收到資訊:我新建了一個專案
所有者收到資訊:我幫你改了一個BUG

總結:

雖然解耦了同事類,但他們和中介類的耦合挺緊密的,並且每新增一個類,中介類都要相應修改。對於複雜系統來說,中介類會過於的複雜。 所以要謹慎使用這個模式。 書中提到的適用場景: 中介者模式一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合(比如一個程式窗體(中介者)之於其中的各種元件(按鈕、選單、顯示框等同事類)) 以及想定製一個分佈在多個類中的行為,而又不想生成太多的子類的場合。