中心思想:
????? 把變化的部分和不變的部分隔離開來。用接口來“抽取”
出來。
實(shí)現(xiàn):
實(shí)際整個(gè)Strategy的核心部分就是抽象類的使用,【可以用接口,】(用抽象類聲明對(duì)象變量引用不同的子類對(duì)象)使用Strategy模式可以在用戶需要變化時(shí),修改量很少,而且快速.
Strategy
適合下列場合:
1.
以不同的格式保存文件;
2.
以不同的算法壓縮文件;
3.
以不同的算法截獲圖象;
4.
以不同的格式輸出同樣數(shù)據(jù)的圖形,比如曲線 或框圖bar等
具體操作步驟:
???
這里以字符串替代為例, 有一個(gè)文件,我們需要讀取后,希望替代其中相應(yīng)的變量,然后輸出.關(guān)于替代其中變量的方法可能有多種方法,這取決于用戶的要求,所以我們要準(zhǔn)備幾套變量字符替代方案.
1,我們建立一個(gè)抽象類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中有一個(gè)抽象方法abstract需要繼承明確,這個(gè)replace()里其實(shí)是替代的具體方法.
2,兩種方案的實(shí)現(xiàn)類,實(shí)現(xiàn)抽象方法replace()?
public class RepTempRuleTwo extends RepTempRule
public class RepTempRuleOne extends RepTempRule
3,我們要建立一個(gè)算法解決類,用來提供客戶端可以自由選擇算法。
?
?1
public
?
class
?RepTempRuleSolve?
{?
?2
?3
private
?RepTempRule?strategy;?
//
抽象類不可以生成對(duì)象,但是可以生成對(duì)象變量,去引用已經(jīng)實(shí)現(xiàn)抽象方法的子類
?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)?
{??
//
通過該方法動(dòng)態(tài)改變strategy
16
strategy?
=
?newAlgorithm;
17
18
}
19
?
4,程序中使用。可以方便的切換實(shí)現(xiàn)方案。
??? //
使用第一套替代方案
RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleOne ());
solver.getNewContext(site,context);
//使用第二套
solver=new RepTempRuleSolve(new RepTempRuleTwo());
solver.getNewContext(site,context);
?