中心思想:
把变化的部分和不变的部分隔离开来。用接口来“抽取”
出来。
实现:
实际整个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);