策略模式與簡單工廠模式的結合使用

  Java設計模式中的策略模式(Strategy Patten)定義了一組算法,將每一個算法都封裝起來,而且可以使它們之間能夠相互替換,在客戶端調用它們時能夠互不影響。算法

策略模式主要由三個角色組成設計模式

一、抽象策略角色:一般是一個接口或抽象類實現,咱們的具體策略類就是繼承或實現這個抽象角色。this

二、具體策略角色:咱們在這些類中寫策略和算法,繼承或實現抽象策略角色。spa

三、環境角色:環境角色中擁有一個抽象策略角色的引用,供客戶端調用,該角色把客戶端跟策略類的實現分離。設計

從上面的三個策略模式的角色中,咱們就大概能夠知道策略模式的編寫步驟,這裏以實現簡單的四則運算爲例。code

一、定義抽象策略角色,也就是定義一個公共的抽象類(也能夠是接口)對象

 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *定義抽象策略角色
 6  */
 7 public abstract class Strategy {
 8     //定義抽象策略的方法
 9     public abstract int strategy(int a,int b);
10 
11 }

二、編寫策略類,該類實現上面定義的抽象類blog

 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  * AddStrategy
 6  */
 7 public class AddStrategy extends Strategy {
 8     //定義實現加法的策略方法
 9     public int strategy(int a, int b)
10     {
11         return a+b;
12     }
13 
14 }
 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    SubStrategy
 6  */
 7 public class SubStrategy extends Strategy {
 8     //定義減法的策略方法
 9     public int strategy(int a, int b)
10     {
11         return a-b;
12     }
13 
14 }
 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    MultiplyStrategy
 6  */
 7 public class MultiplyStrategy extends Strategy {
 8     //定義乘法的策略方法
 9     public int strategy(int a,int b)
10     {
11         return a*b;
12     }
13 }
 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    DivStrategy
 6  */
 7 public class DivStrategy extends Strategy {
 8     //定義除法的策略方法,這裏爲了簡單就不考慮除數爲零的狀況了
 9     public int strategy(int a,int b)
10     {
11         return a/b;
12     }
13 }

三、編寫環境角色,其中持有一個抽象策略類的引用繼承

 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    Context
 6  */
 7 public class Context {
 8     //持有抽象策略角色的引用,用於客戶端調用
 9     private Strategy strategy;
10     //得到策略類
11     public Strategy getStrategy() {
12         return strategy;
13     }
14     //設置所需策略
15     public void setStrategy(Strategy strategy) {
16         this.strategy = strategy;
17         
18     }
19     //根據設置的策略類返回對應的結果
20     public int getResult(int a,int b)
21     {
22         return strategy.strategy(a, b);
23     }
24 
25 }

四、編寫客戶端接口

 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    Client
 6  */
 7 public class Client {
 8     public static void main(String[] args) {
 9         
10         Context context = new Context();
11         
12         int result;
13         
14         context.setStrategy(new SubStrategy());
15         
16         result = context.getResult(9, 3);
17         
18         System.out.println("sub: "+result);
19         
20         context.setStrategy(new AddStrategy());
21         
22         result =context.getResult(9, 3);
23         
24         System.out.println("add: "+result);
25         
26         context.setStrategy(new DivStrategy());
27         
28         result = context.getResult(9, 3);
29         
30         System.out.println("div: "+result);
31         
32         context.setStrategy(new MultiplyStrategy());
33         
34         result = context.getResult(9, 3);
35         
36         System.out.println("mul: "+result);
37     }
38 }

 

輸出結果:

上面只是用到策略模式,下面加上簡單工廠模式

工廠類

 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    Factory
 6  */
 7 public class Factory {
 8     public Strategy createStrategy(String str)
 9     {
10         if("AddStrategy".equalsIgnoreCase(str))
11         {
12             return new AddStrategy();
13         }
14         else
15             if("SubStrategy".equalsIgnoreCase(str))
16             {
17                 return new SubStrategy();
18             }
19             else
20                 if("DivStrategy".equalsIgnoreCase(str))
21                 {
22                     return new DivStrategy();
23                 }
24                 else
25                     if("MultiplyStrategy".equalsIgnoreCase(str))
26                     {
27                         return new MultiplyStrategy();
28                     }
29                     else
30                         return null;
31     }
32 
33 }

客戶端類

 1 package strategy;
 2 /**
 3  * 
 4  * @author CIACs
 5  *    Client
 6  */
 7 public class Client {
 8     public static void main(String[] args) {
 9      
10         Context context = new Context();
11         int result;
12         Strategy strategy;
13         Factory fac = new Factory();
14         strategy = fac.createStrategy("AddStrategy");
15         context.setStrategy(strategy);
16             result = context.getResult(9, 3);
17         System.out.println(result);
18     }
19 }

輸出結果:

固然這裏的工廠類中的if-else的使用是不太好的,簡單工廠模式把生成策略類與客戶端分離。

總結:

  策略模式使開發人員可以開發出不少可替換的組件,而組件間是弱鏈接的,體現了代碼的可重用行,弱鏈接也爲之後開發新的組件打下了基礎,具備較強的可擴展性,易於維護。策略模式是對算法的封裝它把算法的責任和算法自己分割開委派給別的對象管理客戶端決定應該使用什麼策略,所以客戶端須要理解全部具體策略類之間的區別,這也增長了客戶端的使用難度。

相關文章
相關標籤/搜索