Java設計模式之Strategy(策略模式)
策略模式的定義:
它定義了一組算法,將每個算法都封裝起來,并且使它們之間可以互換。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化。
這里以四則運算舉例:輸入兩個數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.造成很多的策略類。