2012年5月11日

白話 Design Pattern (七) Adapter Pattern, Abstract Server Pattern

想像一下,如果今天你的主管交代了一個任務,要你從一台老舊的電腦找一份遠古時期的資料。你試了一下,很幸運的它還能開機,但是,它竟然沒有USB介面來連接你的滑鼠,而這個年代,已經沒有人生產PS/2滑鼠了,要怎麼辦?難道要到拍賣場找一隻堪用的嗎?

如果你知道有『USB to PS/2 轉接頭』這樣的東西,相信這個問題根本不是問題。

事實上,生活中我們的確使用了許許多多的轉接頭,如:電源線三孔轉兩孔、手機用micro usb 轉 usb線、出國用萬用插座...,因為有了轉接器,讓我們可以在不同規格間使用某些設備。

Adapter Pattern正是轉接器。主要目的便是藉由轉接方式,解決介面不同的問題。它的結構也很簡單,就是一頭接我們要的介面,另一頭接提供功能的元件,然後作對應。




使用時機:通常都不是自己新開發的系統,而是為了讓舊有的元件得以繼續運作,或是為了某些外購的元件。


==================================

在Agile Software Development, Principles, Patterns, and Practices一書中,另外提到一個可搭配Adapter的Abstract Server Pattern,它一樣很簡單,卻也是常出現的基本概念。

Abstract Server Pattern就是在原本直接的關聯中加入一個抽象,好讓物件間的藕合度降低。簡單的說,就是DIP(依賴倒轉)原則。

書中的例子(圖上部),原本的設計將『燈』與『開關』直接關聯,這樣一來有開關就必須有燈不可。加入一個interface後,就能將其間的關聯性減輕,日後如果電扇要用這個開關,也只要繼承抽象的interface即可。



如果考慮到使用開關的物件可能來自外部元件或舊有的元件,而無法遵循現在開發的interface,那搭配了Adapter就能進一步達成(如下圖)。



本文將這些模式說得很簡單,其實也是想說其實設計模式未必是艱澀難懂,或需要強記的,事實上,即使是沒聽過設計模式的人,如果在撰寫程式時,考慮了減輕耦合、增加彈性之類的概念,也有可能設計出接近這樣的結構。

學習設計模式不是為了找地方套用這些架構,而是你遇到難以取捨之處,可以參考看看你的設計是否考慮周詳,故了解每個模式的精神、形成原因才是最重要的。



沒有留言:

張貼留言