天天看點

[設計模式筆記]三. 行為型模式--19. Mediator模式(中介者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解七. 相關模式

行為型模式--Iterator模式(疊代器)對象行為型模式

一. 意圖

       用一個中介對象來封裝一系列的對象互動. 中介者使各對象不需要顯式地互相引用, 進而使其耦合松散, 而且可以獨立地改變它們之間的互動.

二. 适用性

一組對象以定義良好但是複雜的方式進行通信。産生的互相依賴關系結構混亂且難以了解.

一個對象引用其他很多對象并且直接與這些對象通信, 導緻難以複用該對象.

想定制一個分布在多個類中的行為,而又不想生成太多的子類(中介者對象包含這些類對象?)

三. 模式結構

[設計模式筆記]三. 行為型模式--19. Mediator模式(中介者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解七. 相關模式

圖1 

四. 角色說明

Mediator

—中介者定義一個接口用于與各同僚(Colleague)對象通信.

ConcreteMediator(具體中介者)

—具體中介者通過協調各同僚對象實作協作行為.

—了解并維護它的各個同僚.

Colleague(同僚類)

—每一個同僚類都知道它的中介者對象.

—每一個同僚對象在需與其他的同僚通信的時候,與它的中介者通信..

[設計模式筆記]三. 行為型模式--19. Mediator模式(中介者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解七. 相關模式

圖2

可以看到, 每一個同僚對象中都一個中介者對象的引用.

同僚向一個中介者對象發送和接收請求. 中介者在各同僚間适當地轉發請求以實作協作行為.

五. 說明

1. 減少了子類生成Mediator将原本分布于多個對象間的行為集中在一起. 改變這些行為隻需生成Meditator的子類即可. 這樣各個Colleague類可被重用(否則, 你可能需要對不同的對象互動生成一個子類來協調同僚對象之間的互動)

2. 它将各Colleague解耦Mediator有利于各Colleague間的松耦合. 你可以獨立的改變和複用各Colleague類和Mediator類.

3. 它簡化了對象協定 用Mediator和各Colleague間的一對多的互動來代替多對多的互動. 一對多的關系更易于了解, 維護和擴充.

4. 它對對象如何協作進行了抽象将中介作為一個獨立的概念并将其封裝在一個對象中, 使你将注意力從對象各自本身的行為轉移到它們之間的互動上來. 這有助于弄清楚一個系統中的對象是如何互動的.

5. 它使控制集中化 中介者模式将互動的複雜性變為中介者的複雜性. 因為中介者封裝了協定, 它可能變得比任一個Colleague都複雜. 這可能使得中介者自身成為一個難于維護的龐然大物.

六. 我的了解

1. 該模式很好了解. 把對象的多對多互動關系變成一對多的互動關系. 例如在C++中, Class1和Class2, Class1與Class3有互動, 則此時Class1需要包含Class2和Class3的頭檔案, 那麼它們就被耦合在一起了. 如果加多了中介者類, Class1隻與中介者類聯系. 隻包含中介者的頭檔案. (這裡是舉例, 沒有絕對, 看需求).

2. 同時, 中介者的作用不隻是為了"集中頭檔案", 還負責了各對象的互動(這個可以差別Facade模式), Facade模式類似于統一接口, 而中介者是集中互動..

3. 每一個Colleague類中都有一個中介者對象的引用, 當需要與其他對象互動時, 則直接調用中介者對象對應的接口即可.

4. 個人了解, 不一定需要抽象Mediator類, 看需求, 也不一定需要抽象Colleague類, 還是主要看需求吧.

這樣子行嗎?

[設計模式筆記]三. 行為型模式--19. Mediator模式(中介者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解七. 相關模式

圖3

這樣子行嗎?

[設計模式筆記]三. 行為型模式--19. Mediator模式(中介者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解七. 相關模式

圖4

我覺得可以.

七. 相關模式

Facade與中介者的不同之處在于Facade是對一個對象子系統進行抽象, 進而提供了一個更為友善的接口. 它的協定是單向的, 即Facade對象對這個子系統類提出請求, 但反之則不行. 相反, Mediator提供了各Colleague對象不支援或不能支援的協作行為, 而且協定是多向的

繼續閱讀