iT邦幫忙

2021 iThome 鐵人賽

DAY 22
1

  今天要介紹的模式Mediator,與上一篇Facade的結構有點雷同,不過Mediator是屬於行為型模式,作用不太一樣,現在就來了解Mediator在做甚麼以及與Facade的差異吧!


問題情境與解析

  Mediator Pattern強調的是各個獨立的類別之間無法互相往來,而這些類別如有需要進行合作的話,就會由Mediator本身來協調類別與類別之間的運作,而這些類別只會依賴於一個Mediator,而不是耦合其他的類別。

  舉個例子,飛機與飛機之間不會直接互相通信,他們只會與塔台交談,給塔台相關的位置訊息,或是得到塔台提供的飛行資訊,使飛機與飛機的飛行路徑不會有所衝突,而造成空難。倘若沒有了中央塔台,飛行員就要先了解周圍的每架飛機,並與他們討論著飛行路徑或是著陸的優先順序等等,這樣也許會造成飛機失事的機率大大提升。

  隨著時間的推移,系統的類別只會越來越多,這些類別之間的往來也會變得越來越複雜,使得維護的成本越來越高。若碰到這種問題就可以用中介者模式來解決,它可以不讓類別與類別之間互相通信,它們唯一的方法就是透過中介者來傳遞訊息。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211007/20140743W69DVi4qr0.png

Skeleton Code

interface Mediator {
    public void notify(Component sender);
}

class ConcreteMediator implements Mediator {
    ComponentA componentA = new ComponentA();
    ComponentB componentB = new ComponentB();
    
    public void notify(Component sender) {
        if (sender == componentA) {
            reactOnA();
        } else {
            reactOnB();
        }
    }
    
    public void reactOnA() {
        // do something
    }
    
    public void reactOnB() {
        // do something
    }
}

interface Component {}

class ComponentA implements Component {
    private Mediator mediator;
    
    public void operation() {
        mediator.notify(this);
    }
}

class ComponentB implements Component {
    private Mediator mediator;
    
    public void operationB() {
        mediator.notify(this);
    }
}

  雖然使用Mediator就可以減少程式中各個類別之間的耦合,也能夠更輕鬆的重用單一物件,但是要注意的是,Mediator可能會隨著程式不斷的更新,而進化成God Object。


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 21-Facade 外觀模式
下一篇
IT鐵人DAY 23-Command 命令模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
lw90967
iT邦新手 5 級 ‧ 2021-10-08 11:54:23

推推

我要留言

立即登入留言