協調多個物件之間的互動 中介者模式(一)

2021-06-12 05:06:40 字數 2477 閱讀 8837

第二種是通過qq群聊天,如圖20-1所示。如果我們使用圖20-1(a)所示方式,乙個使用者如果要與別的使用者聊天或傳送檔案,通常需要加其他使用者為好友,使用者與使用者之間存在多對多的聯絡,這將導致系統中使用者之間的關係非常複雜,乙個使用者如果要將相同的資訊或檔案傳送給其他所有使用者,必須乙個乙個的傳送,於是qq群產生了,如圖20-1(b)所示,如果使用qq群,乙個使用者就可以向多個使用者傳送相同的資訊和檔案而無須一一進行傳送,只需要將資訊或檔案傳送到群中或作為群共享即可,群的作用就是將傳送者所傳送的資訊和檔案**給每乙個接收者使用者。通過引入群的機制,將極大減少系統中使用者之間的兩兩通訊,使用者與使用者之間的聯絡可以通過群來實現。

圖20-1 qq聊天示意圖

在有些軟體中,某些類/物件之間的相互呼叫關係錯綜複雜,類似qq使用者之間的關係,此時,我們特別需要乙個類似「qq群」一樣的中間類來協調這些類/物件之間的複雜關係,以降低系統的耦合度。有乙個設計模式正為此而誕生,它就是本章將要介紹的中介者模式

sunny軟體公司欲開發一套crm系統,其中包含乙個客戶資訊管理模組,所設計的「客戶資訊管理視窗」介面效果圖如圖20-2所示:

圖20-2 「客戶資訊管理視窗」介面圖

sunny公司開發人員通過分析發現,在圖20-2中,介面元件之間存在較為複雜的互動關係:如果刪除乙個客戶,要在客戶列表(list)中刪掉對應的項,客戶選擇組合框(combobox)中客戶名稱也將減少乙個;如果增加乙個客戶資訊,客戶列表中需增加乙個客戶,且組合框中也將增加一項。

如果實現介面元件之間的互動是sunny公司開發人員必須面對的乙個問題?

sunny

公司開發人員對元件之間的互動關係進行了分析,結果如下:

(1) 當使用者單擊「增加」按鈕、「刪除」按鈕、「修改」按鈕或「查詢」按鈕時,介面左側的「客戶選擇組合框」、「客戶列表」以及介面中的文字框將產生響應。

(2) 當使用者通過「客戶選擇組合框」選中某個客戶姓名時,「客戶列表」和文字框將產生響應。

(3) 當使用者通過「客戶列表」選中某個客戶姓名時,「客戶選擇組合框」和文字框將產生響應。

於是,sunny公司開發人員根據元件之間的互動關係繪製了如圖20-3所示初始類圖:

圖20-3 「客戶資訊管理視窗」原始類圖

與類圖20-3所對應的框架**片段如下:

//按鈕類

class button

public void update()

......

}//列表框類

class list

public void update()

......

}//組合框類

class combobox

public void update()

......

}//文字框類

class textbox

......

}

分析圖20-3所示初始結構圖和上述**,我們不難發現該設計方案存在如下問題:

(1)系統結構複雜且耦合度高:每乙個介面元件都與多個其他元件之間產生相互關聯和呼叫,若乙個介面元件物件發生變化,需要跟蹤與之有關聯的其他所有元件並進行處理,系統元件之間呈現一種較為複雜的網狀結構,元件之間的耦合度高。

(2)元件的可重用性差:由於每乙個元件和其他元件之間都具有很強的關聯,若沒有其他元件的支援,乙個元件很難被另乙個系統或模組重用,這些元件表現出來更像乙個不可分割的整體,而在實際使用時,我們往往需要每乙個元件都能夠單獨重用,而不是重用乙個由多個元件組成的複雜結構。

(3)系統的可擴充套件性差:如果在上述系統中增加乙個新的元件類,則必須修改與之互動的其他元件類的源**,將導致多個類的源**需要修改,同樣,如果要刪除乙個元件也存在類似的問題,這違反了「開閉原則」,可擴充套件性和靈活性欠佳。

由於存在上述問題,sunny公司開發人員不得不對原有系統進行重構,那如何重構呢?大家想到了「迪公尺特法則」,引入乙個「第三者」來降低現有系統中類之間的耦合度。由這個「第三者」來封裝並協調原有元件兩兩之間複雜的引用關係,使之成為乙個松耦合的系統,這個「第三者」又稱為「中介者」,中介者模式因此而得名。下面讓我們正式進入中介者模式的學習,學會如何使用中介者類來協調多個類/物件之間的互動,以達到降低系統耦合度的目的。

物件之間的互動

class person 定義乙個人類 role person 人的角色屬性都是人 def init self,name,aggressivity,life value self.name name 每乙個角色都有自己的暱稱 self.aggressivity aggressivity 每乙個角色都...

再次強調中介者模式,物件之間互相呼叫解耦

第乙個版本 class goodservice paginate query paginate perpage foreach paginate as row return row public function initrow row return row public function get ...

多個Activity之間的切換與資料互動

兩個activity之間切換我概括的分為兩步 1.實現切換操作。2.配置中宣告另外乙個acitivity!顯示定義乙個intent 物件,intent 這個類的機制是協助互動的。intent 中的putextra 函式是起到兩個activity之間相互互動的,這個方法類似 hashtable 或者 ...