[DesignPattern生涯實例回顧01]Strategy mode,Interpreter mode,Chain of Responsibility mode,Facade mode,Bridge mode,Adapter mode,Factory mode,Builder mode

[DesignPattern生涯實例回顧01]Strategy mode,Interpreter mode,Chain of Responsibility mode,Facade mode,Bridge mode,Adapter mode,Factory mode,Builder mode

目前正值求職之際,剛好在104上面有不少的職缺都需求design pattern
便趁這個機會瞭解一下自己懂得多少、還有在工作生涯中實際用過的案例有多少吧!
觀看以下文章之前請先於"參考資料"區域,閱讀KarateJB這篇Design pattern的系列文章,並且上wiki查詢各種mode的定義
以下見解屬個人主觀看法,有任何意見都歡迎留言喔

1.Strategy mode
wiki:In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime
舉例來說,之前碰過要產出dynamic SQL的情況,當時有十個系統功能,每個系統功能都有查詢功能以及列印報表功能,我的習慣一般都會先宣告一個abstract class,此類別的兩個method就是"產出查詢的SQL"以及"產出報表的SQL",之後這10個系統功能就根據自己的需求各自繼承這個abstract class,並實做"產出查詢的SQL"以及"產出報表的SQL"的細節。用口語一點的方式解釋的話,就是大家先講好要做這件事情的method的名稱要怎麼取,取好了之後,各自的系統功能的產出SQL的細節就是看各自系統的需求去各憑本事、各自實做囉

2. Interpreter mode
舉例來說,之前曾經做過不少爬蟲專案,基本上爬蟲的行為就是"把資料抓下來"==>"剖析資料的重點",資料的格式有時候是html,有時候是JSON,我的習慣一般都會先宣告一個abstract class去定義爬蟲的重點行為有兩個 1."把資料抓下來" 2."剖析資料的重點",之後要爬不同網站的爬蟲就自行宣告自己的類別並實做剛才宣告的abtract class。用口語一點的方式解釋的話,就是進來的資料格式雖然不同,但是最終目的都是希望把資料整合成一個人類肉眼容易瞭解的格式,只要大家把最後的格式先講好,之後各自要怎麼去拆解資料就各憑本事了

3.Chain of Responsibility mode
wiki:In object-oriented design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects.
舉例來說,當你開發的系統是公文簽核系統或是請假系統的時候,便非常適合使用這個mode,當你有公文需要直屬主管簽核的時候,首先系統第一步會想要發送通知請你的直屬主管來做簽核,但是很巧的是今天可能直屬主管已經請假了,系統當然馬上會發現這個狀況,因此系統的第二步將會想要改成發送通知給Team主管來做簽核,萬一又很剛好Team主管也請假,系統的第三步就會發送通知給部門主管了。用口語一點的方式來說明的話,就是要做好一件事情,如果作法有很多種,而且有分成最簡單的方法、次要簡單的方法……直到最後的最不容易且最耗費系統資源的方法,當然事先選用最先簡單的方法囉!特別要強調一點,要發揮這個mode的威力,一定要用遞迴的方式去寫喔!如果你用switch case或是 if + 一堆elseif去寫,保證後續維護的人看不懂……兩個月後自己再回來看程式,連自己也看不懂。

4.Facade mode
wiki:The facade pattern (also spelled façade) is a software-design pattern commonly used with object-oriented programming. Analogous to a facade in architecture, a facade is an object that serves as a front-facing interface masking more complex underlying or structural code
這個模式我把他稱為外貌協會 XD
舉例來說,在以前做過的其中一個公家單位的系統之中,該系統有一個功能是需要計算員工薪水之後,再以客製化的報表格式呈現給客戶看的。首先在計算薪水的部分,是牽扯到很多相關公家單位規定的,因此計算公式絕對很複雜,再來是客製化的報表的格式絕對是看每個客戶的個人喜好的,因此也不會是很容易設定的格式。想像你在實做這個功能的時候,把所有計算的公式的程式碼還有報表排版的程式碼通通寫在一起、甚至被你塞在同一個function裡面(有塞爆的FU),你覺得過個一個月之後再來維護這隻功能的時候,你還看的懂嗎?如果接手的是你的同事,你覺得他看的懂嗎?這時候很簡單,例如我們可以把計算的部分獨立出來成為一個function,叫做"計算金額()",報表排版的部分獨立出來叫做"排版成報表()",這樣是不是對後面接手的同事親切多了呢~口語的方式來解釋的話,就是不要把太多太繁複的工作都塞在同一個function裡面,可以切出去到其他的小function的話就切出去,適合丟到db用預存程序做的也可以切出去,不要一個function裡面有1000行的程式碼~我想大概每個人去看的時候都會暈倒的 @@"

5.Bridge mode
wiki:The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its implementation so that the two can vary independently", introduced by the Gang of Four.[1] The bridge uses encapsulation, aggregation, and can use inheritance to separate responsibilities into different classes.
這個在職涯中還真沒用過,網路上的範例大多都是"將interface的實做類別的部分method封裝成另一個interface,之後由其他廠商或其他同事?去實做封裝起來的這個interface的類別,然後再把這個實做的結果當成參數傳回原本的interface的實做類別",說實在的,看完還真有點頭暈@@" 用我個人的方式解釋的話:相信大家都知道委派的使用方法如果用很口語的方式解釋的話,就是將一個function當成參數,然後把參數傳遞到另外一個function,Bridge mode的概念其實就很像是一口氣傳遞了多個function的參數,只是他不是一個function一個function傳過去,他是把這些function先包成一個interface再傳過去,常用委派的人應該一聽就懂了。
常用在當第三方合作廠商使用自己公司提供的library的時候,這時候第三方廠商會先根據library規定的interface的規格去實做自己的interface,然後再把這個實做完畢的interface當成參數傳到library以使用library裡面的相關method

6.Adapter mode
wiki:In software engineering, the adapter pattern is a software design pattern (also known as wrapper, an alternative naming shared with the decorator pattern) that allows the interface of an existing class to be used as another interface.[1] It is often used to make existing classes work with others without modifying their source code
網路上的作法有很多種,我就直接選一種比較喜歡的方式做解釋了。
如果是基本的adapter mode的作法的話,其實就是繼承的概念,繼承了父類別之後,子類別可以直接引用父類別的屬性跟方法,至於子類別如果有額外的屬性,那就直接加進去子類別,如果父類別的method有一小部分需要修改才適合子類別使用的話,在父類別的method加入一些委派的參數讓子類別自行客製化即可,這樣一來就可以達到不需修改既有程式碼的原有邏輯即可再度使用的目的

7. Factory mode
wiki:Define an interface for creating an object, but let subclasses decide which class to instantiate. The Factory method lets a class defer instantiation it uses to subclasses.
google上面有很多種工廠模式,這邊只針對wiki介紹的這種提供個人看法喔。
口語的解釋的話,其實就是設定某個class的其中一個method的回傳型態為interface,通常用在這個method牽扯內容過於龐大,一口氣難以做完的時候,可以把牽扯的內容切割成多個class去實做這個interface,比較急的部分就可以優先實做,比較不急的部分就可以晚點實做。常常聽到使用者有說句話:這個部分比較不急,可以先不上(您是否覺得有點耳熟呢? XD)

8. Builder mode
wiki:The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create different representations.
其實builder mode大家都已經在用了,只要你是做管理資訊系統的,一定都已經將商業邏輯層、DB操控層、UI顯示層的程式邏輯分開在不同的library,當你使用整個管理資訊系統裡面任何一個功能的時候,你就已經在使用builder mode了!因為你已經正在透過這一個系統功能去呼叫一連串的已經切割出去的商業邏輯層的程式碼以及呼叫一連串的DB操控層的程式碼,這就是Builder mode了。





參考資料:
Learning Design Pattern in 30 real-case practices 系列 -KarateJB - 2018 iT 邦幫忙鐵人賽(這邊要特別感謝此文章作者KarateJB,提供了相當易懂的範例)
https://ithelp.ithome.com.tw/users/20103220/ironman/1343