设计模式之Strategy(策略)

转载 2013年12月03日 11:01:22

Strategy策略模式是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.

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 class RepTempRuleTwo extends RepTempRule{


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等

http://item.taobao.com/item.htm?spm=a1z10.1.w4004-4326034836.2.j8zf6u&id=35896826787

浅谈JAVA设计模式之——策略模式(Strategy)

一、概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为...
  • l1028386804
  • l1028386804
  • 2015年05月09日 14:02
  • 1840

Strategy策略模式和State/Bridge模式的区别

Strategy策略模式 如果系统中某个类的某一行为存在多种实现方式,而且这些实现方式可以互换时使用策略模式。 如果系统中某个类的对象存在多种状态,不同状态下行为有差异,而且这些状态之间可以发生转换...
  • Blues1021
  • Blues1021
  • 2015年09月12日 00:26
  • 976

设计模式之策略(Strategy)模式

Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法。从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已。动机在开发中,我们常常会遇到概...
  • lihao21
  • lihao21
  • 2015年08月26日 19:51
  • 2047

Java设计模式——策略模式(Strategy Pattern)

Java设计模式——策略模式(Strategy Pattern) 场景一 描述:刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,...
  • u012401711
  • u012401711
  • 2016年09月07日 21:16
  • 1003

C++设计模式<四>:策略模式(Strategy)

1.动机在软件构件过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。2.模式定义定义一系列算法,把它们...
  • MonroeD
  • MonroeD
  • 2016年04月08日 01:16
  • 346

设计模式:策略模式(Strategy)

转自:http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html 前言 万事开头难,最近对这句话体会深刻!这篇文章是这个系列正式开始介...
  • u011630575
  • u011630575
  • 2016年04月13日 23:00
  • 334

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版...
  • u012515223
  • u012515223
  • 2014年05月22日 13:31
  • 2869

我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通...
  • LCL_data
  • LCL_data
  • 2013年08月24日 10:59
  • 12731

【APIs — A Strategy Guide】第二章 把API作为你的商业策略

如果你身处技术界, 你不会怀疑API对业务的显著影响,否则,可能有点难以理解为什么API会跟你的业务有关系。在商业领域API每天都在快速增长,本章节的论点应该能帮助不在科技界的人了解API的重要性,同...
  • huawei_eSDK
  • huawei_eSDK
  • 2016年06月20日 10:05
  • 1791

Jenkins配置基于角色的项目权限管理

Jenkins配置基于角色的项目权限管理 一.安装插件 首先需要安装三方插件:Role-Based Strategy 1.系统管理   2.插件管理   3.可选插件安装(搜索Rol...
  • qq_30553235
  • qq_30553235
  • 2017年06月22日 17:18
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之Strategy(策略)
举报原因:
原因补充:

(最多只允许输入30个字)