1. Strategy Pattern -- 把演算法則整個換掉

    用的時間點

    strategy 是 "戰略" 的意思,泛指與敵方對峙時的作戰策略以及解決問題的方法等。在程式設計裡,不妨把它視為 "運算法則"。

    如何設計

    任何一種程式都是為了解決問題而撰寫出來,解決問題時需要實作一些特定的運算法則。在 Strategy Pattern 之下,可以更換實作運算法則的部份而且不留痕跡。切換整個運算法則,簡化改採其它方法來解決同樣問題的動作。

    程式範例

    設計電腦遊戲 "剪刀石頭布"。猜拳時的設略有兩種方法。

    • 猜贏之後繼續出同樣的招式 (WinningStrategy)。
    • 從上一次出的招式,以機率分配方式求出下一個招式的機率 (ProbStrategy)。

    Strategy 參與者

    規定使用戰略之介面的參與者。例如 Strategy 介面。

    ConcreteStrategy 參與者

    實作 Strategy 參與者之介面的參與者。這裡會實際編寫有關具體戰略的程式。例如 WinningStrategy 類別和 ProbStrategy 類別。

    Context (文法) 參與者

    利用 Strategy ...

    Read more...


  2. Template Method Pattern -- 實際處理交給子類別

    用的時間點

    就像在塑膠版上挖空,然後用色筆塗滿挖空的部份,所表現出來的是固定的字型,但顏色卻因所使用的色筆顏色而異。所挖空的部份我們稱為 Template。

    如何設計

    將作為 Template 的方法定義在父類別,而方法的定義中則使用到抽象方法。因此如果只看父類別部份的程式,根本不知道到底結果會是怎樣的處理內容,最多只能了解該如何呼叫抽象方法而已。

    實際實作抽象方法的是子類別。要在子類別實作方法,才能決定具體的處理動作。理論上,如果在不同的子類別執行不同的實作,應該就能發展出不同的處理內容。不過,無論在哪個子類別執行任何一種實作,處理的大致流程都還是要依照父類別所制定的方法。

    像這樣在在父類別指定大綱並且在子類別規定具體內容,就稱為 Template Method Pattern。

    程式範例

    輸出字串,同樣流程的display,卻有不同的輸出方式(字串或字元)。

    AbstractClass (抽象類別) 參與者

    AbstractClass 實作範本方法,還有宣告 Template Method 所使用的抽象方法。這個抽象方法則由子類別 ConcreteClass 負責實作。例如 AbstractClass 類別 ...

    Read more...


  3. Visitor Pattern -- 在結構中穿梭還同時做事

    用的時間點

    資料結構裡儲存了很多個元素,假設現在要對所有元素進行一項 處理。那麼,這項 處理 的程式碼應該寫在哪裡?以常理來判斷,應該要寫在表示資料結構的類別裡面,不過如果這項 處理 的動作不只一個的話,該怎麼辦? 每次要做新處理的時候,就必須修改資料結構的類別。

    如何設計

    Visitor Pattern 把 資料結構處理 兩者分開,另外寫一個表示在資料結構內穿梭來去的主體 訪客 的類別,然後把處理交給這個類別來進行。如此一來,如果想追加新的處理動作時,只要再建立一個新的訪客即可。而在資料結構這邊,也只要能接受來敲門的訪客就能完成動作。

    程式範例

    這個程式是訪客穿梭在由檔案和目錄組成的資料結構內,以列印檔案總覽。

    Visitor (訪客) 參與者

    Visitor 是對每個資料結構中的具體元素 (ConcreteAcceptor) 宣告 已經去找過XXXX 的 visit(XXXX) 方法。visit(XXXX ...

    Read more...


  4. Abstract Factory Pattern -- 把相關零件組合成產品

    用的時間點

    所謂的抽象,意思是指不考慮要如何具體進行實作,只注意介面的部份。抽象工廠把各種抽象零件組合成產品。

    如何設計

    處理的重點是在介面而不是零件的具體實作。只利用介面就能把零件組合成產品。

    程式範例

    將一個階層結構的相關網站鏈結做成HTML檔。

    包含下列三個 package 的類別群組:

    • factory --- 含抽象工廠、零件和產品
    • 含 Main 的預設package
    • listfactory --- 含具體工廠、零件和產品

    AbstractProduct 參與者

    AbstractProduct 規定由 AbstractFactory 所產生的抽象零件及產品的介面。例如 Link、Tray 和 Page 類別。

    AbstractFactory 參與者

    AbstractFactory 規定用來產生 AbstractProduct 的物件個體的介面。例如 Factory 類別。

    Client 參與者

    Client ...

    Read more...


  5. Adapter Pattern -- 換個包裝再度利用

    用的時間點

    例如將直流電換成交流電,轉換器的功能是介入既有內容和需要結果之間,作為溝通的橋樑。

    如果既有內容無法直接利用時,通常需要先轉換成必要的型態後再使用。具有填平既有內容需要結果兩者間的落差就是 Adapter Pattern

    如何設計

    設計wrapper,將既有內容包裝之後,重新再利用。

    程式範例(繼承)

    改變輸出字串的外框,採用繼承。

    程式範例(委讓)

    改變輸出字串的外框,採用委讓。

    Target (對象) 參與者

    決定現在需要什麼方法的參與者,例如筆記型電腦必須要有直流電才能動。例如 Print 介面。

    Client 參與者

    利用 Target 的方法來做事的參與者,例如有直流電 12V 才能用的比較型電腦。例如 Main 類別。

    Adaptee (被動符合) 參與者

    具有既有方法的參與者 ...

    Read more...


  6. atoi及itoa的實作

    很簡單但面試似乎很常問,先紀錄一下。

    //ignore header files
    int atoi(char *);
    void itoa(int,char *);
    void reverse(char *);
    int main(int argc, char const* argv[])
    {
        char s[] = "12345";
        //string to integer
        int i = atoi(s);
        printf("%d\n",i);
        char *a = (char *)malloc(50);
        //integer to string
        itoa(i,a);
        //12345
        printf("%s ...

    Read more...


  7. Bridge Pattern -- 分成功能階層和實作階層

    用的時間點

    bridge 是 橋樑 的意思。就像現實社會裡的橋樑擔負著連接河川兩岸的重責大任一樣,Bridge Pattern 也是負責連接兩個不同位置的參與者。

    如何設計

    Bridge Pattern 居間溝通的兩個位置是指 功能的類別階層實作的類別階層

    想要新增功能時

    假設現在有一個類別 Something,如果想對 Something 新增其它功能時(例如,想多加一個新方法),首先要建立 SomethingGood 類別作為 Something 的子類別 (子類別、衍生類別或擴充類別)。這就是一個小型的類別階層。 這個階層是為了新增功能而建立:

    • 基本功能放在父類別
    • 新功能則新增到子類別

    又稱為 功能的類別階層。 假設現在又想對 SomethingGood 類別新增另一個功能時。此時,要建立 SomethingBetter 類別作為 SomethingGood 類別的子類別。如此一來,功能的類別階層又往下延伸一層。

    如欲追加新功能時,找出類別階層中最接近目的的類別 ...

    Read more...


  8. Builder Pattern -- 組合複雜的物件個體

    用的時間點

    所謂萬丈高樓平地起,大樓首先得打穩地基並搭建骨架,再由上而下一層層蓋上去。一般來說,如果搭建的結構愈複雜就愈難一氣呵成。

    如何設計

    你得先把整個架構分成幾個部份,等到個別部份都完成了之後再依序組合起來才行。

    程式範例

    設計一個建立文件的程式吧!

    • 含有一個標題
    • 含有一些字串
    • 含有一些有項目符號的項目

    Builder 類別規定組成文件的方法,而 Director 類別利用這個方法才能產生一份文件具體的文件。

    Builder 類別是抽象類別,不含實際的處理內容,僅宣告抽象方法而已。決定產生文件的具體處理內容則是 Builder 類別的子類別。

    以下幾個類別為 Builder 類別的子類別。

    • TextBuilder 類別
    • HTMLBuilder 類別

    Director 若使用 TextBuilder 則可產生一般格式的文件,如果使用 HTMLBuilder 則可產生 HTML 格式的文件。

    Builder 參與者

    Builder 規定產生物件個體的介面。包括有產生物件個體各個部份的方法和取得最後結果的方法。例如 ...

    Read more...


« Page 5 / 13 »