Java設計模式之Strategy(策略模式)

xyang81 14年前發布 | 3K 次閱讀 HTML5 JavaScript F# Office 15

策略模式的定義:

  它定義了一組算法,將每個算法都封裝起來,并且使它們之間可以互換。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化。

這里以四則運算舉例:輸入兩個數a和b我們可能會進行加減乘除等操作,具體采用哪種操作,由用戶自己決定,代碼如下:

1.將計算結果抽象出一個計算類,這個類只聲明了一個計算的方法,具體執行什么樣的計算,由具體的子類去實現:

public abstract class Calc {

 public abstract void operate(float a, float b);
}

 

2.創建具體的計算類

/**
 * 加法計算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Add extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "+" + b + "=" + (a + b));
 }

}

 

/**
 * 減法計算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Subtraction extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "-" + b + "=" + (a - b));
 }

}

 

/**
 * 乘法計算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Mult extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "*" + b + "=" + (a * b));
 }

}

 

/**
 * 除法計算
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Div extends Calc {

 public void operate(float a, float b) {
  System.out.println(a + "/" + b + "=" + (a / b));
 }

}

 

3.創建一個算法類,由這個類決定執行特定的算法(有點像代理)

/**
 * 算法
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Algorithm extends Calc {
 
 private Calc calc; 
 
 public Algorithm(Calc calc){
  this.calc = calc;
 }

 public void operate(float a, float b) {
  calc.operate(a, b);
 }
}

 

/**
 * 測試
 * @since Jul 12, 2010
 * @author YangXin
 * @version 1.00 Jul 12, 2010
 */
public class Client {

 /**
  * @param args
  * @since Jul 12, 2010
  * @author YangXin
  * @version 1.00 Jul 12, 2010
  */
 public static void main(String[] args) {
  Calc calc = new Algorithm(new Add());  //執行加法運算
  calc.operate(10f, 5f);
  calc = new Algorithm(new Subtraction()); //執行減法運算
  calc.operate(10f, 5f);
  calc = new Algorithm(new Div());   //執行除法運算
  calc.operate(10f, 5f);
  calc = new Algorithm(new Mult());   //執行簡潔運算
  calc.operate(10f, 5f);
  //可見,如想用不同的計算方法,只需創建不同的計算對象即可,不需要改變其它任何地方,實現了類似組件式的編程
 }

}

 

優點:
 1.提供了管理相關的算法族的辦法。
 2.提供了可以替換繼承關系的辦法。
 3.避免使用多重條件轉移語句
缺點:
 1.客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
 2.造成很多的策略類。

 本文由用戶 xyang81 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!