軟體設計模式學習(二十一)中介者模式
阿新 • • 發佈:2020-05-27
> 對於那些存在物件之間複雜互動關係的系統,中介者模式提供了一種簡化複雜互動的解決方案,即通過引入一箇中介者,將原本物件之間的兩兩互動轉化為每個物件與中介者之間的互動
## 模式動機 以微信聊天為例,可以使用者與使用者直接聊天,也可以通過微信群聊天。前者的話,使用者要和別的使用者加為好友,即使用者和使用者之間存在多對多關係,一個使用者如果要將相同的資訊傳送給所有其他使用者,必須一個一個傳送。而如果使用群聊天,一個使用者可以向多個使用者傳送相同資訊而無須一一進行傳送,只需將資訊傳送到群中即可,群的作用就是將傳送者所傳送的資訊轉發給每一個接收者使用者。 在使用者與使用者直接聊天的設計方案中,使用者物件之間存在很強關聯性,將導致系統出現如下問題: - 系統結構複雜 - 物件可重用性差 - 系統擴充套件混亂 根據單一職責原則,我們應儘量將物件細化,使其只負責單一職責。一個由很多物件構成的模組,為了減少物件兩兩之間複雜的引用關係,我們需要使用中介者模式,這就是中介者模式的模式動機。
## 模式結構 ![](https://img2020.cnblogs.com/blog/1759254/202005/1759254-20200527124947330-518340632.png) 1. Mediator(抽象中介者) 定義一個介面,該介面應用於各同事物件之間的通訊 2. ConcreteMediator(具體中介者) 抽象中介類的子類,通過協調各個同事物件來實現協作行為,瞭解並維護它對各個同事物件的引用。 3. Colleague(抽象同事類) 定義各同事的公有方法 4. ConcreteColleague(具體同事類) 每一個同事物件都引用一箇中介者物件,每一個同事物件在需要時和其他同事物件通訊時,先與中介者通訊,通過中介者來間接完成與其他同事的通訊
## 模式優缺點 中介者模式優點: 1. 簡化物件間的互動。用中介者和同事的一對多互動代替了原來同事之間多對多互動,更利於理解、維護和擴充套件。 2. 將各同事解耦。我們可以獨立的改變、增加和複用各同事和中介者,符合開閉原則 3. 減少子類生成。中介者將原本分佈於多個物件的行為集合在一起,改變這些行為只需生成新的中介者子類即可,各個同事類可被重用。 中介者模式缺點: 1. 具體中介者類包含了同事之間的互動細節,可能會導致中介者類非常複雜,難以維護。
## 模式適用環境 以下情況可以使用中介者模式: - 系統物件之間存在複雜的引用關係 - 一個物件由於引用了其他很多物件並直接與其通訊,導致難以複用該物件 - 想通過一箇中間類來封裝多個類的行為,而又不想生成太多子類,可以使用中介者類,在中介者類中定義物件互動的公共行