《設計模式精解》學習筆記(十)------Strategy(策略)模式

來源:互聯網
上載者:User

《設計模式精解》學習筆記(十)------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
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.