Mediator 中介者模式 [MD]


博文地址

我的GitHub 我的博客 我的微信 我的郵箱
baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

中介者模式

簡介

用一個中介者對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使耦合松散,而且可以獨立地改變它們之間的交互。

中介者模式也稱為調解者模式或者調停者模式。

當程序存在大量的類時,多個對象之間存在着依賴的關系,呈現出網狀結構,那么程序的可讀性和可維護性就變差了,並且修改一個類需要牽涉到其他類,不符合開閉原則。

因此我們可以引入中介者,將網狀結構轉化成星型結構,可以降低程序的復雜性,並且可以減少各個對象之間的耦合。

角色說明:

  • 抽象中介者Mediator:定義用於各個同事類之間通信的接口
  • 具體中介者ConcreteMediator:實現抽象中介者中定義的方法,它需要了解並維護每個同事對象,並負責協調各個同事對象的交互關系
  • 抽象同事類Colleague:同事對象只知道中介者而不知道其他同事對象,同事類之間必須通過中介者才能進行消息傳遞
  • 具體同事類ConcreteColleague:每個具體同事類都知道自己本身的行為,其他的行為只能通過中介者去進行

中介者模式的優點

  • 適當地使用中介者模式可以避免同事類之間的過度耦合,使得各同事類之間可以相對獨立地使用
  • 降低了系統對象之間的耦合性,使得對象易於獨立的被復用
  • 提高系統的靈活性,使得系統易於擴展和維護
  • 使用中介者模式可以將對象間一對多的關聯轉變為一對一的關聯,使對象間的關系易於理解和維護
  • 使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用

適用場景

  • 在面向對象編程中,一個類必然會與其他的類發生依賴關系,完全獨立的類是沒有意義的。一個類同時依賴多個類的情況也相當普遍,既然存在這樣的情況,說明,一對多的依賴關系有它的合理性,適當的使用中介者模式可以使原本凌亂的對象關系清晰。
  • 一般來說,只有對於那種同事類之間是網狀結構的關系,才會考慮使用中介者模式。
  • 使用中介者模式,可以將網狀結構變為星狀結構(星狀結構的中心當然是中介者啦),使同事類之間的關系變的清晰一些。

中介者模式是一種比較常用的模式,也是一種比較容易被濫用的模式。對於大多數的情況,同事類之間的關系不會復雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關系封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更復雜。

優點

  • 降低類的關系復雜度,將多對多轉化成一對多,實現解耦。
  • 符合迪米特原則,依賴的類最少。

缺點

  • 同事類越多,中介者的邏輯就越復雜,會變得越難維護。
  • 如果本來類的依賴關系不復雜,但是使用了中介者會使原來不復雜的邏輯變得復雜。

通過使用一個中間對象來進行消息分發以及減少類之間的直接依賴。

演示

說到中介者,肯定就想到了房屋中介,下面以房屋中介為例,房東通過中介發布出售信息,中介就會把房屋信息傳遞給有這需求的購房者,購房者再通過中介去看房買房等等。

同事

抽象同事角色

無論是房東還是購房者,他們都能夠發布信息和接受信息

public abstract class Person {//人物類
    protected HouseMediator houseMediator;

    public Person(HouseMediator houseMediator) {
        this.houseMediator = houseMediator;//獲取中介
    }

    public abstract void send(String message);//發布信息
    public abstract void getNotice(String message);//接受信息
}

具體同事角色

下面分別創建一個房東類和一個買房者類

public class Purchaser extends Person {
    public Purchaser(HouseMediator houseMediator) {
        super(houseMediator);
    }

    @Override
    public void send(String message) {
        System.out.println("買房者發布信息:" + message);
        houseMediator.notice(this, message);
    }

    @Override
    public void getNotice(String message) {
        System.out.println("買房者收到消息:" + message);
    }
}
public class Landlord extends Person {
    public Landlord(HouseMediator houseMediator) {
        super(houseMediator);
    }

    @Override
    public void send(String message) {
        System.out.println("房東發布信息:" + message);
        houseMediator.notice(this, message);
    }

    @Override
    public void getNotice(String message) {
        System.out.println("房東收到消息:" + message);
    }
}

中介者

抽象中介者角色

這里就是房屋中介,定義一個通知的方法:

 public interface HouseMediator {//房屋中介類
    void notice(Person person, String msg);//通知方法
}

具體中介者角色

具體的房屋中介,以鏈家為例,他們能從房東和買房者獲得信息,然后做出不同的行為:

public class Lianjia implements HouseMediator {
    Purchaser mPurchaser; //買房者類
    Landlord mLandlord; //房東

    public void setPurchaser(Purchaser purchaser) {//設置買房者
        mPurchaser = purchaser;
    }

    public void setLandlord(Landlord landlord) {//設置房東
        mLandlord = landlord;
    }


    @Override
    public void notice(Person person, String message) {//發送通知
        System.out.println("中介收到信息,並轉發給相應的目標人群");
        if (person == mPurchaser) {
            mLandlord.getNotice(message);
        } else if (person == mLandlord) {
            mPurchaser.getNotice(message);
        }
    }
}

客戶端測試

 public void test() {
    Lianjia houseMediator = new Lianjia();
    Purchaser purchaser = new Purchaser(houseMediator);
    Landlord landlord = new Landlord(houseMediator);
    houseMediator.setLandlord(landlord);
    houseMediator.setPurchaser(purchaser);

    landlord.send("出售一套別墅");
    purchaser.send("求購一套學區房");
}

2016-03-20


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM