中心思想:
????? 把變化的部分和不變的部分隔離開來。用接口來“抽取”
出來。
實現:
實際整個Strategy的核心部分就是抽象類的使用,【可以用接口,】(用抽象類聲明對象變量引用不同的子類對象)使用Strategy模式可以在用戶需要變化時,修改量很少,而且快速.
Strategy
適合下列場合:
1.
以不同的格式保存文件;
2.
以不同的算法壓縮文件;
3.
以不同的算法截獲圖象;
4.
以不同的格式輸出同樣數據的圖形,比如曲線 或框圖bar等
具體操作步驟:
???
這里以字符串替代為例, 有一個文件,我們需要讀取后,希望替代其中相應的變量,然后輸出.關于替代其中變量的方法可能有多種方法,這取決于用戶的要求,所以我們要準備幾套變量字符替代方案.
1,我們建立一個抽象類RepTempRule定義一些公用變量和方法:
?1
public
?
abstract
?
class
?RepTempRule
{
?2
?3
protected
?String?oldString
=
""
;
?4
public
?
void
?setOldString(String?oldString)
{
?5
this
.oldString
=
oldString;?
?6
}
?7
?8
protected
?String?newString
=
""
;
?9
public
?String?getNewString()
{
10
return
?newString;
11
}
12
//
以上是公共變量和方法
13
public
?
abstract
?
void
?replace()?
throws
?Exception;
14
15
}
在RepTempRule中有一個抽象方法abstract需要繼承明確,這個replace()里其實是替代的具體方法.
2,兩種方案的實現類,實現抽象方法replace()?
public class RepTempRuleTwo extends RepTempRule
public class RepTempRuleOne extends RepTempRule
3,我們要建立一個算法解決類,用來提供客戶端可以自由選擇算法。
?
?1
public
?
class
?RepTempRuleSolve?
{?
?2
?3
private
?RepTempRule?strategy;?
//
抽象類不可以生成對象,但是可以生成對象變量,去引用已經實現抽象方法的子類
?4
?5
public
?RepTempRuleSolve(RepTempRule?rule)
{
?6
this
.strategy
=
rule;
?7
}
?8
?9
10
11
public
?String?getNewContext(Site?site,String?oldString)?
{
12
return
?strategy.replace(site,oldString);
13
}
14
15
public
?
void
?changeAlgorithm(RepTempRule?newAlgorithm)?
{??
//
通過該方法動態改變strategy
16
strategy?
=
?newAlgorithm;
17
18
}
19
?
4,程序中使用。可以方便的切換實現方案。
??? //
使用第一套替代方案
RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleOne ());
solver.getNewContext(site,context);
//使用第二套
solver=new RepTempRuleSolve(new RepTempRuleTwo());
solver.getNewContext(site,context);
?