设计模式之strategy模式
来源:互联网 发布:u盘数据恢复后是乱码 编辑:程序博客网 时间:2024/05/17 07:29
注:本文参考了《Java设计模式》一书和WWW.jdon.com网站的《Strategy模式》一章
一、Strategy模式的意图:
策略操作定义了策略的输入和输出,而把策略的实现工作留给了各个类。这些类以不同的方案来实现同一操作,它们为用户提供统一的接口,因而这些类可以相互替换。
Strategy模式允许多种策略共存,而代码不会混乱。策略模式也可以实现模式选择逻辑和策略本身相分离。
Strategy模式的意图在于把可选的策略或方案封装在不同的类中,并在这些类中实现一个共同的操作。
二、Strategy模式的例子:
·抽象父类:
·继承子类:
·帮助类:
三、Strategy模式的特点:
·有一个抽象的父类/接口,在其中定义了操作的模板(类似于Template模式)
·有一至多个实现类或子类,实现了父类/接口中的模板方法
·有一个可供客户端动态切换算法的帮助类,该类拥有一个策略对象,可以在初始化时指定默认的策略,也可以在运行时通过set方法动态切换策略
四、Strategy模式与其它模式的比较:
·Strage模式与State模式的比较
在对状态进行建模时,状态的迁移是一个重要的方面(即如何切换到上、下一个状态);而在对策略进行建模时,迁移与策略的选择并不相关(即关注的是操作的策略,对象状态的切换并不是关注的方面)。
另外一个不同之处就是,Strategy模式可能允许客户选择或者提供一个策略,而State模式却很少设计这样的思路。
·Strategy模式与Template模式的比较
Strategy模式的最大特点是可以在运行期间动态地切换算法。这一点和“Template”模式有点不同,后者虽然也提供抽象的模板框架,并且由子类继承实现,Template模式一般在确定之后的运行期间就不会再次切换了。而前者可以或者说需要在运行期间动态地切换
五、Strategy模式的适用场合:
一、Strategy模式的意图:
策略操作定义了策略的输入和输出,而把策略的实现工作留给了各个类。这些类以不同的方案来实现同一操作,它们为用户提供统一的接口,因而这些类可以相互替换。
Strategy模式允许多种策略共存,而代码不会混乱。策略模式也可以实现模式选择逻辑和策略本身相分离。
Strategy模式的意图在于把可选的策略或方案封装在不同的类中,并在这些类中实现一个共同的操作。
二、Strategy模式的例子:
·抽象父类:
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;
}
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;
}
·继承子类:
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{
//replaceFirst是jdk1.4新特性
newString=oldString.replaceFirst("aaa", "bbbb")
System.out.println("this is replace one");
}
}
public class RepTempRuleTwo extends RepTempRule{
public void replace() throws Exception{
newString=oldString.replaceFirst("aaa", "ccc")
System.out.println("this is replace Two");
}
}
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;
}
}
// 当前的策略
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;
}
}
三、Strategy模式的特点:
·有一个抽象的父类/接口,在其中定义了操作的模板(类似于Template模式)
·有一至多个实现类或子类,实现了父类/接口中的模板方法
·有一个可供客户端动态切换算法的帮助类,该类拥有一个策略对象,可以在初始化时指定默认的策略,也可以在运行时通过set方法动态切换策略
四、Strategy模式与其它模式的比较:
·Strage模式与State模式的比较
在对状态进行建模时,状态的迁移是一个重要的方面(即如何切换到上、下一个状态);而在对策略进行建模时,迁移与策略的选择并不相关(即关注的是操作的策略,对象状态的切换并不是关注的方面)。
另外一个不同之处就是,Strategy模式可能允许客户选择或者提供一个策略,而State模式却很少设计这样的思路。
·Strategy模式与Template模式的比较
Strategy模式的最大特点是可以在运行期间动态地切换算法。这一点和“Template”模式有点不同,后者虽然也提供抽象的模板框架,并且由子类继承实现,Template模式一般在确定之后的运行期间就不会再次切换了。而前者可以或者说需要在运行期间动态地切换
五、Strategy模式的适用场合:
1.以不同的格式保存文件;
2.以不同的算法压缩文件;
3.以不同的算法截获图象;
4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等
- 设计模式之 strategy
- 设计模式之Strategy
- 设计模式之Strategy模式
- 设计模式之strategy模式
- 设计模式之---Strategy 模式
- 设计模式之Strategy模式
- 设计模式之Strategy模式(策略模式)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 设计模式之Strategy Pattern
- 菜鸟修炼C语言小设计之——工资统计
- 经典多态例题(二)
- JVM 启动调优
- Android高手进阶教程(一)-------Android常用命令集锦(图文并茂)!
- Flex自定义事件:一个地方派发(抛出),任何地方监听(捕获)
- 设计模式之strategy模式
- 经典SQL语句大全
- 文件操作类StreamWriter 、StreamReader、FileStream 、File、FileInfo 、DirectoryInfo 、Directory
- 安装cross toolchain及NO_PUBKEY错误解决办法
- 分页栏的web标准实现(始终显示第一页的页码和最后一页的页码)
- 菜鸟修炼C语言小设计之——通讯录
- 用C#实现屏幕吸色功能,附逻辑思维讲解图,功能代码不超过50行即可实现
- Android高手进阶教程(二)之----Android Launcher抽屉类SlidingDrawer的使用!
- 迪杰斯特拉算法