當你看到文章標題的時候,一般就知道了什麼事策略模式,不過我還是要囉嗦一下,那麼,先給出策略模式的定義吧。
策略模式:軟件設計模式的一種,策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
問題:
一個模擬鴨子的遊戲,即有各種各樣的鴨子,具有不同的行爲,有的鴨子可以飛,有的不可以飛,並且叫聲也不同,還有不會叫的鴨子。
如果不知道策略模式的話,那麼我們大約有兩種比較容易想到的方法來解決這個問題:
1.寫一個鴨子的基類,但是這樣做的缺點很明顯,那就是我們需要每一隻鴨子類都必須覆蓋基類的函數(方法)。
2.使用接口(C++還沒有接口- -!),這樣做的缺點就是每一隻鴨子類中都要寫對應的方法,並且不容易更改。
於是,這裏就用到了策略模式,定義FlyBehavior與QuackBehavior行爲接口,並且用這兩個接口定義兩個變量作爲基類的成員變量,而我們創造一組具體的行爲類來實現FlyBehavior與QuackBehavior接口,這樣,我們就可以讓鴨子的某個成員變量(兩個接口類型的)來調用每個鴨子對應的方法,這樣我們大大減少了代碼量,而且使得鴨子改變行爲成爲了可能(比如本來呱呱叫,突然得病啞了)。
代碼較多,知道有些人不喜歡看冗長的文章,於是我決定把代碼放到文章最後的鏈接裏,需要的可以去下載,代碼不多,命名也比較規範,看起來應該很容易明白。
那接着說策略模式吧,先放一張uml圖:
設計原則:
- 代碼封裝,即相同的代碼要獨立出來。
- 針對接口編程。
- 多用組合,少用繼承
優缺點:
優點:
1. 策略模式提供了管理相關的算法族的辦法。
2. 策略模式提供了可以替換繼承關係的辦法。
3. 使用策略模式可以避免使用多重條件轉移語句。
缺點:
1.客戶端必須知道所有的策略類。
2.策略模式造成很多的策略類。
具體請看百度百科策略模式,感覺總結的優缺點還不錯。
最後,給出一段很短的Java代碼實現最簡單的策略模式(不想看的請無視- -!):
//StrategyExample test application
class StrategyExample {
public static void main(String[] args) {
Context context;
// Three contexts following different strategies
context = new Context(new FirstStrategy());
context.execute();
context = new Context(new SecondStrategy());
context.execute();
context = new Context(new ThirdStrategy());
context.execute();
}
}
// The classes that implement a concrete strategy should implement this
// The context class uses this to call the concrete strategy
interface Strategy {
void execute();
}
// Implements the algorithm using the strategy interface
class FirstStrategy implements Strategy {
public void execute() {
System.out.println("Called FirstStrategy.execute()");
}
}
class SecondStrategy implements Strategy {
public void execute() {
System.out.println("Called SecondStrategy.execute()");
}
}
class ThirdStrategy implements Strategy {
public void execute() {
System.out.println("Called ThirdStrategy.execute()");
}
}
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {
Strategy strategy;
// Constructor
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
this.strategy.execute();
}
}
下載地址:http://download.csdn.net/detail/u013679882/8579757;
歡迎指出不足