1. 以一個算術運算為例,傳統做法為:

          java 代碼
          1. package org.common;   
          2.   
          3. public class Calculate {   
          4.        
          5.     public String getResult(float a,float b,char c){   
          6.            
          7.         float add = a+b;   
          8.         float sub = a-b;   
          9.         float mult = a*b;   
          10.         float division = a/b;   
          11.            
          12.         switch(c){   
          13.             case '+':   
          14.                 return "相加結果為:" + add;   
          15.             case '-':   
          16.                 return "相減結果為:" + sub;   
          17.             case '*':   
          18.                 return "相乘結果為:" + mult;   
          19.             case '/':   
          20.                 return "相除結果為:" + division;   
          21.             default:   
          22.                 return "出錯";   
          23.         }   
          24.     }   
          25.   
          26. }  

           

          java 代碼
          1. package org.common;   
          2.   
          3. public class Test {   
          4.        
          5.     public static void main(String[] args){   
          6.         float a = 200;   
          7.         float b = 50;   
          8.         Calculate cal = new Calculate();   
          9.         System.out.println(cal.getResult(a, b, '+'));   
          10.         System.out.println(cal.getResult(a, b, '-'));   
          11.         System.out.println(cal.getResult(a, b, '*'));   
          12.         System.out.println(cal.getResult(a, b, '/'));   
          13.         System.out.println(cal.getResult(a, b, '('));   
          14.     }   
          15.   
          16. }   

           

          運行結果為:

           相加結果為:250.0
          相減結果為:150.0
          相乘結果為:10000.0
          相除結果為:4.0
          出錯

          2. 用策略模式來實現:

          策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。
          策略模式使得算法可以在不影響到客戶端的情況下發生變化。使用策略模式可以把行為和環境分割開來。
          環境類負責維持和查詢行為類,各種算法則在具體策略中提供。由于算法和環境獨立開來,算法的修改都不會影響環境和客戶端

          策略模式:

          由三部分組成

          A:  抽象策略角色:策略類,通常由一個接口或者抽象類實現
          B:  具體策略角色:包裝了相關的算法和行為
          C:  環境角色:持有一個策略類的引用,最終給客戶端調用的。

          一個抽象策略角色:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 抽象策略角色  
          4.  */  
          5. public abstract class AbstractStrategy {   
          6.   
          7.     public abstract String calculate(float a,float b);   
          8. }   

          幾個具體策略角色:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class SubStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a-b;   
          9.         return "相減結果為:" + result;   
          10.     }   
          11. }  

           

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class AddStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a+b;   
          9.         return "相加結果為:" + result;   
          10.     }   
          11. }   

           

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class MultStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a*b;   
          9.         return "相乘結果為:" + result;   
          10.     }   
          11. }  

           

           

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 具體策略角色  
          4.  */  
          5. public class DivisionStrategy extends AbstractStrategy{   
          6.   
          7.     public  String calculate(float a,float b){   
          8.         float result = a/b;   
          9.         return "相除結果為:" + result;   
          10.     }   
          11. }   

          環境角色:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 環境角色,最終給客戶端調用的  
          4.  */  
          5. public class ContextRole {   
          6.   
          7.     /**  
          8.      * 擁有一個策略類的引用  
          9.      */  
          10.     private AbstractStrategy abstactStrategy;   
          11.        
          12.     public ContextRole(AbstractStrategy abstactStrategy){   
          13.         this.abstactStrategy = abstactStrategy;   
          14.     }   
          15.        
          16.     public String calculate(float a,float b) {   
          17.         String result = abstactStrategy.calculate(a, b);   
          18.         return result;   
          19.     }   
          20. }  

          客戶端調用:

          java 代碼
          1. package org.strategy;   
          2. /**  
          3.  * 客戶端  
          4.  */  
          5. public class Test {   
          6.        
          7.     public static void main(String[] args){   
          8.         float a = 200;   
          9.         float b = 25;   
          10.            
          11.         ContextRole contextRole1 = new ContextRole(new AddStrategy());   
          12.         System.out.println(contextRole1.calculate(a, b));   
          13.            
          14.         ContextRole contextRole2 = new ContextRole(new SubStrategy());   
          15.         System.out.println(contextRole2.calculate(a, b));   
          16.            
          17.         ContextRole contextRole3 = new ContextRole(new MultStrategy());   
          18.         System.out.println(contextRole3.calculate(a, b));   
          19.            
          20.         ContextRole contextRole4 = new ContextRole(new DivisionStrategy());   
          21.         System.out.println(contextRole4.calculate(a, b));   
          22.            
          23.     }   
          24.   
          25. }   

           

          輸出結果為:

          相加結果為:225.0
          相減結果為:175.0
          相乘結果為:5000.0
          相除結果為:8.0

          總結:

          策略模式優點:

          1.可以很方便的動態改變算法或行為

          2.避免使用多重條件轉移語句

          策略模式缺點:


          1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
          2.造成很多的策略類。

          posted on 2008-11-04 09:38 caihaibo 閱讀(267) 評論(0)  編輯  收藏 所屬分類: java模式
          主站蜘蛛池模板: 教育| 洞口县| 凯里市| 特克斯县| 保亭| 石城县| 塔城市| 盱眙县| 康定县| 平昌县| 左云县| 镇赉县| 柳河县| 香河县| 玛曲县| 剑河县| 乐安县| 万荣县| 辽阳县| 张掖市| 郓城县| 泊头市| 毕节市| 响水县| 渭南市| 金坛市| 洪雅县| 勃利县| 乐山市| 交口县| 松滋市| 梁河县| 赣州市| 隆林| 杭州市| 安丘市| 资中县| 玛多县| 丰宁| 清徐县| 明水县|