活用設計樣式(三)

代理者、轉接器、傳遞者、觀察者
樣式之應用

作者:謝嘉瑋、吳立仲

指導:趙光正

簡介

針對於 proxy(代理者) adapter(轉接器)、 mediator(傳遞者)與 observer(觀察者)之間提供一種有間接性(indirect)的溝通模式。他們在涵義上有一定程度的相似性,所以對這兩對proxy(代理者) adapter(轉接器)』、『mediator(傳遞者)與 observer(觀察者)』加以比較。

在比較這四個 pattern 的過程中發現,所用到的例子中不一定都符合 design pattern 的完整結構。但是都有這些 design pattern 的特質,且在其中 pattern 的變化型並不都與一開始使用這些 pattern 的原始目的相同。例如:在 Proxy 中,原始目的:替其他物件預留代理者空位,藉此控制存取其他物件。但是因為時機上的使用不同,並不是所有變化型都有相同的使用目的或是相同結構!如: remote proxyvirtual proxysmart reference 等。導致花費許多時間在比較其差異性、結構、使用方式!但是最後發現,其實基本精神上是相同的。所以試圖利用真實的例子把其精神表現出來,而不流於對結構的堅持。

以下將舉出一個以銀行體系的例子(見圖一、圖二)加以比較上面所題的四個 design pattern,使得 ProxyMediatorObserverAdapter這四種 design pattern 的觀念更顯得具體化。其中:

1.           Proxy 是以外匯部門的交易運作為例。

2.         Adapter 是以保險部門的業務為例。

3.         Observer 是以放款部門的運作為例。

4.         Mediator 是以總機部門為例。

此外proxy(代理者)、 adapter(轉接器)』這一對比較重於介面的相異,mediator(傳遞者)與 observer(觀察者)』則是強調溝通方式的不同,所以並不會另外比較其他組合。

 

圖一、銀行體系的簡圖

 

基本結構

間接性- A B 需要溝通,但是經由 C 來達成。以此降低 AB 之間的耦合力(coupling!這樣子當 B 變動時,因為 A 是藉由 C 達成效果,就不會受到 B 變動的影響。

圖二、間接性

 

 

圖三、銀行架構

 

 

l          Proxy

使用動機

客戶為了匯款到遠地,利用銀行外匯部門的『遠端匯款業務』進行交易,而銀行則利用外商銀行的匯款據點,達成目的。

 

使用情形

當一個客戶打算匯一筆貨款到奈及利亞,從台南分行的外匯部門櫃檯(proxy所承辦的『遠端匯款業務(介面)』中做這一筆遠端匯款交易,但是因為這一家銀行並沒有在奈及利亞設立據點。所以必需利用外商公司來完成交易,例如這個例子中的(法國國家巴黎銀行),他們可能在奈及利亞有設立分行或是辦事處等!所以客戶雖然表面上是和外匯部門櫃檯交易,但是實際上的交易活動卻是由外匯部門櫃檯要求法國國家巴黎銀行完成的!

 

特點

經由這樣的架構,客戶可以完成在不同空間的限制中,達成原本不可行的工作目標!其中 proxy 可以扮演跨越空間限制上宏溝的角色,由別人實做原本交付於自身的任務。這是一個 remote proxy 的範例!

 

l          Adapter

使用動機

因為客戶現在可以和銀行直接購買保險,所以銀行必需處理本身與保險公司之間資料溝通。

 

使用情形

吳小仲今天因為出國渡假,所到台南分行換外幣,剛好看到這家分行有推出旅遊平安險(介面)這樣的業務,所以就到保險部門櫃檯辦理。可以看到目前銀行為了做到異業結合,所以也賣起保險來!那當客戶購買保險時,銀行如何做到把『與客戶間的交易』『與保險公司(介面)之間的交易』充分的結合?所以必須建立一個轉換機制。因為真正辦理保險的是新光保險公司,所以客戶只是藉由台南分行的保險部門櫃檯新光保險公司做交易,保戶資料經由保險部門櫃檯送到新光保險公司,由他們來處理,利用這樣的方式完成購買保險的服務。

 

特點

adapter 可以讓兩種不同型態的東西一起使用,雖然他與 proxy 有部分涵義上的相似,都是把別人交付的任務交給第三者來進行。但是最大的不同點是,第三者的型態不同!在  proxy 上,第三者是相同型態的(例如:台南分行外匯部門法國國家巴黎銀行外匯部門),而在 adapter 上第三者是不同的(台南分行新光保險公司)。我們可以清楚看到銀行保險公司的不同!

 

l          Mediator

使用動機

    台中分行因業務需求必需與 New York 分行聯絡,但是銀行體系中,為了減少不當的使用越洋電話、電報等,所以公司規定必需由總行的總機來接通或是居中處理。即台中分行----總機----- New York 分行這樣的方式

 

使用情形

    而在實際上的使用情形,台中分行先告訴總機(mediator,我有一份文件或是越洋電報要給New York 分行,總機接受要求後,在向台中分行要求要傳送過去的資料,總機再告訴New York 分行說,我有一份從台中分行要給你的資料,在傳送過去。

 

特點

    因為mediator是這一個架構(台中分行----總機-----New York 分行)的核心,所以經由這樣的架構。每一個物件之間只需要建立與mediator之間的溝通管道,因此可以大幅度減少彼此之間溝通的複雜度。

 

l          Observer

使用動機

當新竹分行發現他所往來的一個客戶有債務與信用問題,所以他必須通知每一個分行那一個客戶現在信用有問題,停止對那一個客戶的借貸。

 

使用情形

新竹分行ConcreteObserver)發現上述問題時,他必須要告訴總行的債權管理部相關的訊息。而債權管理部門必需擁有通知其下所有分行有關信用問題的能力,以及改變信用問題的能力,在這邊總行債權管理部會將資訊丟給分行的貸款部門,使用債權信用業務(介面),把客戶債權資訊傳至分行。所以在這一個例子中,這一套訊息可能會傳達到桃園分行、台中分行、或是台南分行,任何總行想通知的分行們!其中分行是否加入這一個通訊體系則是由分行所定,例如 new york 分行並不需要加入這一個(貸款)體系

 

特點

將會發現,其實 observer mediator 相當相似,唯一不同的是。Observer 的架構中,任何一個分行所傳出的訊息,都會經由債權管理部門決定後再被廣播到每一個想要被通知的分行,而 mediator 這個 pattern 中只把消息通知給事先被要求通知的分行。所以我們可以說,他們的行為模式相同,只是對象的數量與主動權不同

其中主動權的解釋:在 observer 這個 pattern 中資料的傳送與接收,是由分行的貸款部門所決定,即握有主動權!而 mediator 這個 pattern 中,傳送與接收是由總機所掌控。