第9章 Strategy模式
来源:互联网 发布:7723java 编辑:程序博客网 时间:2024/06/05 14:36
策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。策略模式使算法可独立于使用它的客户而变化。
策略模式:关键特征
意图:可以根据上下文,使用不同的业务规则或算法。
问题:对所需算法的选择取决于发出请求的客户或者要处理的数据。如果只有一些不会变化的算法,就不需要策略模式。
解决方案:将对算法的选择和算法的实现相分离。允许根据上下文进行选择。
参与者与协作者:Strategy指定了如何使用不同的算法;各ConcreteStrategy实现了这些不同的算法;Context通过类型为Strategy的引用使用具体的ConcreteStrategy。Strategy与Context相互作用以实现所选的算法。Context将来自Client的请求转发给Strategy。
效果:Strategy模式定义了一系列的算法;可以不使用switch语句或条件语句;必须以相同的方式调用所有算法。各ConcreteStrategy与Context之间的相互作用可能需要在Context中加入获取状态的方法。
实现:让使用算法的类包含一个抽象类,该抽象类有一个抽象方法指定如何调用算法。每个派生类按需要实现算法。在原型策略模式中,选择所用具体实现的职责由Client对象承担,并转给策略模式的Context对象。
Stratrgy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现.
这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案.
首先,我们建立一个抽象类RepTempRule 定义一些公用变量和方法:
public abstract class RepTempRule{
protected String oldString="";
public void setOldString(String oldString){
this.oldString=oldString;
}
protected String newString="";
public String getNewString(){
return newString;
}
public abstract void replace() throws Exception;
}
在RepTempRule中 有一个抽象方法abstract需要继承明确,这个replace里其实是替代的具体方法.
我们现在有两个字符替代方案,
1.将文本中aaa替代成bbb;
2.将文本中aaa替代成ccc;
对应的类分别是RepTempRuleOne RepTempRuleTwo
public class RepTempRuleOne extends RepTempRule{
public void replace() throws Exception{
//replaceFirst是jdk1.4新特性
newString=oldString.replaceFirst("aaa", "bbbb")
System.out.println("this is replace one");
}
}
public void replace() throws Exception{
newString=oldString.replaceFirst("aaa", "ccc")
System.out.println("this is replace Two");
}
}
第二步:我们要建立一个算法解决类,用来提供客户端可以自由选择算法。
public class RepTempRuleSolve {
private RepTempRule strategy;
public RepTempRuleSolve(RepTempRule rule){
this.strategy=rule;
}
public String getNewContext(Site site,String oldString) {
return strategy.replace(site,oldString);
}
public void changeAlgorithm(RepTempRule newAlgorithm) {
strategy = newAlgorithm;
}
}
调用如下:
public class test{
......
public void testReplace(){
//使用第一套替代方案
RepTempRuleSolve solver=new RepTempRuleSolve(new RepTempRuleSimple());
solver.getNewContext(site,context);
//使用第二套
solver=new RepTempRuleSolve(new RepTempRuleTwo());
solver.getNewContext(site,context);
}
.....
}
我们达到了在运行期间,可以自由切换算法的目的。
实际整个Strategy的核心部分就是抽象类的使用,使用Strategy模式可以在用户需要变化时,修改量很少,而且快速.
Strategy和Factory有一定的类似,Strategy相对简单容易理解,并且可以在运行时刻自由切换。Factory重点是用来创建对象。
Strategy适合下列场合:
1.以不同的格式保存文件;
2.以不同的算法压缩文件;
3.以不同的算法截获图象;
4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等
- 第9章 Strategy模式
- 《设计模式解析》 第9章 Strategy模式 复习题
- 第 1 章 策略模式【Strategy Pattern】
- 第 1 章 策略模式【Strategy Pattern】
- 第23讲:Strategy 策略模式
- 4.2 《硬啃设计模式》 第19章 设计你的战士 - 策略模式(Strategy Pattern)
- strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- Strategy模式
- STRATEGY 模式
- Strategy 模式
- Strategy模式
- strategy模式
- Strategy模式
- inster数组
- CGI教学:CGI常用环境变量
- 在cxGird中显示行编号
- ASP.NET应用程序设计的10大技巧
- Windows Server 2003的DFS(分布式文件系统)
- 第9章 Strategy模式
- 你的技术之路
- 颠倒黑白 (Inverse) ——利用 .NET Framework 实现图像反色效果小记
- Java的范型(Generics)
- c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex
- 武训离开人间已经整整一百一十五年了
- 分词中判断是否为中文
- 不允许类型 System.DelegateSerializationHolder 和从中派生的类型(例如 System.DelegateSerializationHolder)在此安全级别上被反序列化
- asp.net中常用的一些小技巧