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

定義:

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

結構:(書中圖,侵刪)

 

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

實例:

我以爲git就至關於一箇中介者,用戶之間不用互相認識,可是能夠互相改代碼。
 
抽象中介接口:
package designpattern.mediator;

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

用戶類(抽象同事類):git

package designpattern.mediator;

public abstract class User {
    protected Mediator mediator;

    public User(Mediator mediator) {
        this.mediator = mediator;
    }
}

 倉庫全部者類(具體同事類):ide

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);
    }
}

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

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類(具體中介者類):spa

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);
        }
    }

}

客戶端:3d

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");
    }

}

結果輸出:code

開發者收到信息:我新建了一個項目
全部者收到信息:我幫你改了一個BUG

總結:

雖然解耦了同事類,但他們和中介類的耦合挺緊密的,而且每新增一個類,中介類都要相應修改。對於複雜系統來講,中介類會過於的複雜。
因此要謹慎使用這個模式。
書中提到的適用場景:
中介者模式通常應用於一組對象以定義良好可是複雜的方式進行通訊的場合(好比一個程序窗體(中介者)之於其中的各類組件(按鈕、菜單、顯示框等同事類))
以及想定製一個分佈在多個類中的行爲,而又不想生成太多的子類的場合。
相關文章
相關標籤/搜索