今天假設我要設計一個排序的程式

那至於排序的方法我希望能夠有三種方法:

1.Bubble Sort

2.Quick Sort

3.Merge Sort

那我們的程式可能會這樣寫

1.PNG

▲我利用了switch case去選擇我要排序的方法,

而至於排序實作方法則交給BubbleSort(),QuickSort(),MergeSort(){} 自己去完成

這邊我並沒有把每個排序方法的程式寫出來,各位朋友可以自行補上

2.PNG

 

▲在這邊我利用enum去定義我的三個排序方法

 

這種寫程式的方法出了什麼問題?

1.不易擴充:

   如果今天我希望新增一種排序方法叫做Selectiont Sort,那麼我就必須去改我的switch case

因此違反了OO設計原則中的Open-Closed Principle

2.我的Algorithm這支程式會容易變得太大:

  如果我要再加入一個新的排序方法,那我下面就必須再寫一個method去實作這個方法

因為我現在並沒有將這些排序方法的程式碼寫出來,所以不太有感覺

各位朋友如果要體驗這個force的話,可以把程式寫出來,即便是Pseudo code都能體會到

 

那我們該怎樣讓我們的設計更好呢?

這裡就要談到Design Pattern中的Strategy Pattern

Define a family of algorithm, encapsulate each one, and make them interchangeable.

Strategy lets the algorithm very independently from clients that use it. 《GoF》

策略模式定義了演算法家族,個別封裝起來,讓他們之間可以互相替換,使模式讓演算法的變動,

不會影響到使用演算法的程式。

 

strategy pattern.PNG

接下來我們就把Stratege pattern套用在我們的例子中

首先,先定義我們的Stratege 介面

3.PNG

接著,我們開始實作Concrete Stratege

4.PNG

▲Bubble Sort

5.PNG

▲Quick Sort

6.PNG

▲Merge Sort

再來,我們要實作Context,也就是改一下我們原本的Algorithm

7.PNG

▲在這個程式中,我希望使用者只要輸入他們要用的排序方式

createSort主要是要幫我們把使用者輸入的排序方式然後把我們的Concrete Strategy 的Instance new出來

這種寫法主要想避免以下這種寫法

8.PNG

▲這種寫法當然也可以,但還是一樣老問題,違反了OCP

 

最後,我們就可以測試一下我們的程式是否正常運作了

9.PNG

到後來我們的class diagram就變成這樣了

10.PNG

當我們的程式要用不同的作法或方法去完成一件事情時我們才會討論Strategy pattern是否對我們的設計有幫助

arrow
arrow

    Mark Zhang 發表在 痞客邦 留言(0) 人氣()