1.策略模式概念
策略模式(Strategy Pattern)體現了兩個非常基本的面向對象設計原則。
1> 封裝變化概念 ;
2> 編程中使用接口,而不是對接口的實現,即面向接口編程。
2.定義:
1> 定義一組算法,將每個算法都封裝起來,并且使他們之間可以作為組建互相替換;
2> 策略模式使這些算法在客戶端調用它們的時候能夠互不影響的變化。
3.意義:
1> 策略模式使開發人員能夠開發出由許多可替換的部分組成的軟件,并且各部分之間是
松耦合的關系;
2> 若連接的特性是軟件具有更強的可擴展性,易于維護;更重要的是,他大大提高了軟件
的可重用性。
4.策略模式的組成:
1> 抽象策略角色:策略類,通常由一個接口或者抽象類實現;
2> 具體策略角色:包裝了相關的算法和行為,由實現接口或抽象類的類完成;
3> 環境角色:持有一個策略類的引用,最后給客戶端調用。
5.策略模式的實現:
1> 策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立類中,
從而使得它們可以相互替換;
2> 策略模式使得算法可以在不影響客戶端的情況下發生變化。使用策略模式可以把
行為和環境分割開來;
3> 環境類負責維持和查詢行為類,各種算法則在具體策略中提供。由于算法和環境
相獨立,算法的修改都不會影響環境和客戶端。
6.編寫步驟:
1> 對策略對象定義一個公共接口(抽象策略角色);
2> 編寫各種策略類,該類實現了上面的公共接口(具體策略角色);
3> 在使用策略對象的類中保存一個策略對象的引用(環境角色);
4> 在使用策略對象的類中,實現對策略對象的set和get方法(注入)或者使用構造方法完成賦值
例1:
Strategy.java(抽象策略角色,接口實現)
package cn.edu.bupt.strategy;
public interface Strategy {
int calculate(int a, int b);
}
(具體策略角色,分為兩個實現類,如下)
AddStrategy.java
1 package cn.edu.bupt.strategy;
2
3 public class AddStrategy implements Strategy {
4
5 @Override
6 public int calculate(int a, int b) {
7 return a + b;
8 }
9
10 }
11
SubstractStrategy.java
1 package cn.edu.bupt.strategy;
2
3 public class SubstractStrategy implements Strategy {
4
5 @Override
6 public int calculate(int a, int b) {
7 return a - b;
8 }
9
10 }
11
(環境角色,持有接口的引用但是沒有接口的具體實現類,即面向接口編程,擁有setters 和 getters)
Environment.java
1 package cn.edu.bupt.strategy;
2
3 public class Environment {
4 private Strategy stra; //Strategy類型,面向接口編程
5
6 public Environment(){
7 super();
8 }
9 public Environment(Strategy stra) {
10 super();
11 this.stra = stra;
12 }
13
14 public Strategy getStra() {
15 return this.stra;
16 }
17
18 public void setStra(Strategy stra) {
19 this.stra = stra;
20 }
21
22 public int calculate(int a, int b) {
23 return this.stra.calculate(a, b);
24 }
25 }
26
(客戶端,持有環境類,但是需要通過使用setters 和 getters向環境類中傳入具體的算法,即策略具體實現類)
Client.java
1 package cn.edu.bupt.strategy;
2
3 public class Client {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9 // TODO Auto-generated method stub
10 int a = 3;
11 int b = 4;
12 //實例化環境決策,完成相關的運算
13 Environment env = new Environment();
14
15 //傳入減法策略,執行減法運算
16 env.setStra(new SubstractStrategy());
17 System.out.println(env.calculate(a, b));
18
19 //傳入加法策略,執行加法運算
20 env.setStra(new AddStrategy());
21 System.out.println(env.calculate(a, b));
22 }
23
24 }
策略模式的缺點:
1> 客戶端必須知道所有的實現算法的具體策略類,并自行解決使用哪個策略類;
2> 會造成很多的抽象類。