先摘抄他上面的代码,错误已经改正:
Strategy策略模式是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.Strategy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现.这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案。
- public enum TestStrategy {
- RepTempRuleOne{
- @Override
- public String replace(String oldString) {
- // TODO Auto-generated method stub
- String newString=oldString.replaceFirst("a", "XXX");
- return newString ;
- }
- },
- RepTempRuleTwo{
- @Override
- public String replace(String oldString) {
- // TODO Auto-generated method stub
- String newString=oldString.replaceFirst("n", "***");
- return newString ;
- }
- };
- abstract String replace(String oldString);
- public static void main(String... args){
- String oldString= "www.zuiniuwang.com";
- RepTempRuleSolveEnum repTempRuleSolve=new RepTempRuleSolveEnum(TestStrategy.RepTempRuleOne);
- String myNewString = repTempRuleSolve.getNewContext(oldString);
- System.out.println("newString is "+myNewString);
- repTempRuleSolve.changeAlgorithm(TestStrategy.RepTempRuleTwo);
- myNewString = repTempRuleSolve.getNewContext(oldString);
- System.out.println("Second New String is "+myNewString);
- }
- }
- class RepTempRuleSolveEnum {
- private TestStrategy strategy;
- public RepTempRuleSolveEnum(TestStrategy rule){
- this.strategy=rule ;
- }
- public String getNewContext(String oldString) {
- try {
- return strategy.replace(oldString);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null ;
- }
- public void changeAlgorithm(TestStrategy newAlgorithm) {
- strategy = newAlgorithm;
- }
- }
我们达到了在运行期间,可以自由切换算法的目的。
实际整个Strategy的核心部分就是抽象类的使用,使用Strategy模式可以在用户需要变化时,修改量很少,而且快速.
Strategy和Factory有一定的类似,Strategy相对简单容易理解,并且可以在运行时刻自由切换。Factory重点是用来创建对象。
Strategy适合下列场合:
1.以不同的格式保存文件;
2.以不同的算法压缩文件;
3.以不同的算法截获图象;
4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等
本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/718358,如需转载请自行联系原作者