《設計模式精解》學習筆記(十)------Strategy(策略)模式
GoF:定義一系列的演算法,把他們一個一個封裝起來,並且使他們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。
比如說在我們的系統中需要對一個圖形或一個藝術字上色(這樣的系統在現實中是有的,我呆的前一家公司做的一個票據輸出系統就有這樣的功能)。假如我們需要各種顏色的圖形或藝術字,那麼我們將每一種顏色的圖形或藝術字分別實現一個是非常愚蠢的,因為需求是變化的。當我們實現了某個圖形或藝術字後。應該對一些列顏色分別進行實現。這樣我們就可以不用將顏色和圖形邦定,而使代碼僵化。
下面是案例代碼:(這裡舉的案例比較簡單只是用來說明問題)
先定義顏色抽象類別
package Strategy;
public abstract class Color
{
public abstract void printColor();
}//end class Color
分別實現兩種顏色
package Strategy;
public class RedColor extends Color
{
public void printColor()
{
System.out.println("Print the red color!");
}//end printColor()
}//end class RedColor
package Strategy;
public class BlackColor extends Color {
public void printColor()
{
System.out.println("Print the black color!");
}//end printColor()
}//end class BlackColor
下面實現一個演算法解決類供使用者選擇合適的演算法
package Strategy;
public class ColorSolver
{
private Color color;
public ColorSolver(Color col)
{
this.color = col;
}//end ColorSolver(...)
public void printSingleColor()
{
color.printColor();
}//end printSigleColor()
public void printAllColor(Color col)
{
this.color = col;
}
}//end class ColorSolver
最後讓我們實現調用
package Strategy;
public class StrategyPattern
{
private ColorSolver cs = new ColorSolver( new RedColor());
public void print()//列印出顏色
{
cs.printSingleColor();
cs = new ColorSolver( new BlackColor() );
cs.printSingleColor();
}//end print()
public static void main(String[] args)
{
System.out.println("Strategy Pattern.../n");
StrategyPattern sp = new StrategyPattern();
sp.print();
}//end main(...)
}//end StrategyPattern
運行結果如下
Strategy Pattern...
Print the red color!
Print the black color!
這樣我們達到了運行期間可以隨意切換演算法的目的。
下面是UML圖:
Strategy模式建立在幾條原則的基礎上:
l 對象擁有責任。使用者的責任是知道用什麼演算法。
l 這些責任的不同特定實現通過使用多態來表現。
l 需要將幾個不同的實現按照——概念上——相同的演算法來管理。
l 一個好的設計經驗:將問題領域中發生的行為彼此分離——也就是說,使他們解耦。這讓我們可以改變對某一行為負責的類,而不會對其他行為產生不好的影響。
從某種角度來說,Strategy模式是關於演算法封裝的。但是,在實踐中,我發現可以用它來封裝幾乎任何種類的規則。比如說本文中我舉的關於Color的例子。
Strategy模式關鍵特徵:
l 意圖:讓你可以使用不同的商務規則或演算法——取決於它們出現的情境。
l 問題:需要根據發出請求的客戶或被處理的資料對演算法作出選擇。如果你只是擁有一些不發生變化的演算法,你就不需要Strategy模式。
l 解決方案:將演算法的選擇和演算法的實現相分離。讓客戶可以基於情境作出選擇。
l 效果:Strategy模式定義了一系列的演算法;switch語句或條件陳述式得到了避免;你必須以相同的方式調用所有的演算法,它們必須有相同的介面。
在我看來Strategy模式就是定義了一個抽象類別然後派生出幾個類通過向下轉型得到不同對象的特有方法。再簡單點也就是說是OO概念中多態的運用。(要不就是我理解錯了,還請大家指教)
小結:
Strategy模式是一種定義演算法家族的方法。從概念上來說,所有這些演算法都作相同的工作。他們只是擁有不同的實現。
通過一個抽象類別派生出執行演算法的所有不同方式,主模組上不需要擔心實際使用的是許多可能性中的哪一個。這讓新的變化情況可以被添加進來。,但也產生了管理這些變化情況的需要。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=610786