中介者——對象行爲模式

意圖

定義一箇中介對象來封裝系列對象之間的交互。中介者使各個對象不需要顯示地相互引用,從而使其耦合性鬆散,而且可以獨立地改變他們之間的交互。


適用性

1、一組對象以定義良好但是複雜的方式進行通信。產生的相互依賴關係結構混亂且難以理解。

2、一個對象引用其他很多對象並且直接與這些對象通信,導致難以複用該對象。

3、想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。


結構圖

這裏寫圖片描述

角色

Mediator:中介者接口。在裏面定義了各個同事之間相互交互所需要的方法,可以是公共的方法,如Change方法,也可以是小範圍的交互方法。

ConcreteMediator:具體的中介者實現對象。它需要了解併爲維護每個同事對象,並負責具體的協調各個同事對象的交互關係。

Colleague:同事類的定義,通常實現成爲抽象類,主要負責約束同事對象的類型,並實現一些具體同事類之間的公共功能,比如,每個具體同事類都應該知道中介者對象,也就是每個同事對象都會持有中介者對象的引用,這個功能可定義在這個類中。

ConcreteColleague:具體的同事類,實現自己的業務,需要與其他同事對象交互時,就通知中介對象,中介對象會負責後續的交互。


實現

中介者

public abstract class Mediator {
    //申明一個聯絡方法
    public abstract void constact(String message,Person person);
}
      然後是抽象同事對象:Person.java

public abstract class Person {
    protected String name;
    protected Mediator mediator;

    Person(String name,Mediator mediator){
        this.name = name;
        this.mediator = mediator;
    }

}

兩個具體同事類:HouseOwner.java

public class HouseOwner extends Person{

    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * @desc 與中介者聯繫
     * @param message
     * @return void
     */
    public void constact(String message){
        mediator.constact(message, this);
    }

    /**
     * @desc 獲取信息
     * @param message
     * @return void
     */
    public void getMessage(String message){
        System.out.println("房主:" + name +",獲得信息:" + message);
    }
}

Tenant.java

public class Tenant extends Person{

    Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * @desc 與中介者聯繫
     * @param message
     * @return void
     */
    public void constact(String message){
        mediator.constact(message, this);
    }

    /**
     * @desc 獲取信息
     * @param message
     * @return void
     */
    public void getMessage(String message){
        System.out.println("租房者:" + name +",獲得信息:" + message);
    }
}

具體中介者對象:中介結構、MediatorStructure.java

public class MediatorStructure extends Mediator{
    //首先中介結構必須知道所有房主和租房者的信息
    private HouseOwner houseOwner;
    private Tenant tenant;

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    public void constact(String message, Person person) {
        if(person == houseOwner){          //如果是房主,則租房者獲得信息
            tenant.getMessage(message);
        }
        else{       //反正則是房主獲得信息
            houseOwner.getMessage(message);
        }
    }
}

客戶端:Client.java

public class Client {
    public static void main(String[] args) {
        //一個房主、一個租房者、一箇中介機構
        MediatorStructure mediator = new MediatorStructure();

        //房主和租房者只需要知道中介機構即可
        HouseOwner houseOwner = new HouseOwner("張三", mediator);
        Tenant tenant = new Tenant("李四", mediator);

        //中介結構要知道房主和租房者
        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);

        tenant.constact("聽說你那裏有三室的房主出租.....");
        houseOwner.constact("是的!請問你需要租嗎?");
    }
}

優缺點

優點

1.降低了系統對象之間的耦合性,使得對象易於獨立的被複用。

2.提高系統的靈活性,使得系統易於擴展和維護。

缺點

中介者模式的缺點是顯而易見的,因爲這個“中介“承擔了較多的責任,所以一旦這個中介對象出現了問題,那麼整個系統就會受到重大的影響。


總結

1、 在中介者模式中通過引用中介者對象,將系統中有關的對象所引用的其他對象數目減少到最少。它簡化了系統的結構,將系統由負責的網狀結構轉變成簡單的星形結構,中介者對象在這裏起到中轉和協調作用。

2、 中介者類是中介者模式的核心,它對整個系統進行控制和協調,簡化了對象之間的交互,還可以對對象間的交互進行進一步的控制。

3、 通過使用中介者模式,具體的同事類可以獨立變化,通過引用中介者可以簡化同事類的設計和實現。

4、 就是由於中介者對象需要知道所有的具體同事類,封裝具體同事類之間相互關係,導致中介者對象變得非常複雜,系統維護起來較爲困難。

發佈了63 篇原創文章 · 獲贊 32 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章