我學設計模式 之 策略模式

sz_bdqn發表於2010-09-22

我學設計模式之策略模式

1.       簡介

策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得他們可以相互替換。策略模式可以使演算法在不影響客戶單獨情況下發生變化。

 

 

2.       策略模式的結構

策略模式又稱政策。以下是一個適應性的實現講解策略模式的例項結構:

 

 

 

 

 

 

策略模式涉及到3個角色:

1.    環境角色:持有一個Strategy類的引用。

2.    抽象策略:這是一個抽象角色,通常有一個介面或抽象類實現。此角色給出所有的具體策略類的所有介面。

3.    具體策略:包裝了相關的演算法或行為。

 

3.       策略模式實現

上面UML轉換成Java程式碼清單如下:

環境角色

package com.zsw.strategy;

 

/**

 * 環境角色

 * @author zsw

 */

public class Context {

    private Strategy strategy;

   

    public Context(Strategy strategy){

       this.strategy = strategy;

    }

   

    //策略方法

    public void strategyInterface(){

       this.strategy.strategyInterface();

    }

}

 

 

抽象策略程式碼清單:

package com.zsw.strategy;

/**

 * 抽象策略

 * @author Administrator

 */

public abstract class Strategy {

   

    //策略方法

    public abstract void strategyInterface();

}

 

 

具體策略程式碼清單:

package com.zsw.strategy;

/**

 * 具體策略A

 * @author zsw

 */

public class ConcreteStrategyA extends Strategy {

    @Override

    public void strategyInterface() {

       System.out.println("具體策略A");

    }

}

package com.zsw.strategy;

/**

 * 具體策略B

 * @author zsw

 */

public class ConcreteStrategyB extends Strategy {

    @Override

    public void strategyInterface() {

       System.out.println("具體策略B");

    }

}

 

 

 

 

      

4.       在什麼樣的情況下使用策略模式

1.如果一個系統裡面有許多類,他們之間的差別僅在他們的行為,那麼使用策略模式可以動態的讓一個物件在許多行為中選擇一種行為。

2 一個系統需要動態的在幾種演算法中選擇一種演算法,可以採用策略模式。

   3.一個系統使用的演算法資料不可以讓客戶端知道。

   4.如果一個物件有很多的行為,如果不用恰當的模式,這些行為只好使用多重條件語句來實現。

 

 

5.       策略模式的有優缺點

優點:

l         策略模式提供管理相關演算法族的辦法。

l         策略模式提供了可以替換繼承關係的辦法。

l         使用策略模式可以避免使用多重條件轉移語句。

 

缺點:

l         客戶端必須知道所有的策略類,並自行決定使用那一個策略類。

l         策略模式造成很多的策略類.

 

6.       策略模式應用場景

1)        Java語言中也用到了策略模式,例如在java.awt庫和Swing庫中看到 AWT中的LayoutManager

Java.awt類庫需要在執行期間動態的有客戶端決定一個Container物件怎樣排序列它所有的GUI構件。Java語言提供了幾種不同的排序方式,包裝在不同的類中:

l         Borderlayout

l         FlowLayout

l         GridLayout

l         GridBagLayout

l         CardLayout

 

 

2)        Swing中的Border

在任何一個Swing構件上都可以畫上邊框(Border),而Swing提供了很多的邊框型別,包括bevellinetitled以及CompoundBorder類等Swing構件的基類是JComponent類,而這個類負責為Swing構件畫上邊框。

       Jcomponent實現了paintBorder()方法,並且保持一個私有的對邊框物件的引用。由於Border是一個介面,而不是一個具體的類,因此,這個引用可以指向任何實現了Border介面的邊框物件。

 

 

3)        設計一個排序系統

如果要設計一個排序系統(Sortter System),動態的決定採用二元排序、氣泡排序、堆疊排序、快速排序、基數排序。

顯然策略模式吧幾種排序演算法包裝到不同的演算法類裡面,讓所有的演算法具有相同的介面,就是一個很好的設計。

 

4)        餐飲系統收銀打折

此功能照樣可以採用策略模式來設計,折扣可以根據以下的幾種演算法進行:

1.       對於沒有折扣消費專案。折扣演算法物件返回0作為折扣值。

2.       對於有些消費專案提供一個百分比的折扣。

3.       對於有些會員根據會員等級進行折扣。

4.       對於客戶消費專案滿多少,返回到少的值。例如:滿30050等。

5.       ……

 

5)        一個公司的銷售資料統計

策略模式是指對一項業務功能多種處理方式提供選擇的使用,例如一個公司的銷售資料可以根據其特點,選擇折線、柱狀圖、餅圖等進行處理,這些圖形處理方式是策略,這些可以選擇策略處理功能需求的方式就是策略。

 

6)        再舉一個三國中的例子

當年趙雲保護劉備入吳國迎娶孫權的妹妹,諸葛亮給了他3個錦囊,囊中有個3條妙計,囑咐趙雲伺機行事。這3個錦囊妙計很符合策略模式的定義。諸葛亮的3個錦囊妙計的設計圖如下:

 

 

 

 

 

       趙雲扮演了環境角色,而開後門、開綠燈、阻追兵則是具體的策略。諸葛亮的設定的這些“錦囊妙計”的做法便是抽象策略。

 

 

 

 

待續.....

 

 

相關文章