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里其实是替代的具体方法。

我们现在有两个字符替代方案:

  • 将文本中aaa替代成bbb;
  • 将文本中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等。

系列文章:

Java设计模式(1)工厂模式(Factory模式)

Java设计模式(2)单态模式(Singleton模式)

Java设计模式(3)建造者模式(Builder模式)

Java设计模式(4)原型模式(Prototype模式)

Java设计模式(5)共享模式/享元模式(Flyweight模式)

Java设计模式(6)桥模式(Bridge模式)

Java设计模式(7)装饰模式(Decorator模式)

Java设计模式(8)组合模式(Composite模式)

Java设计模式(9)适配器模式(Adapter模式)

Java设计模式(10)代理模式(Proxy模式)

Java设计模式(11)外观模式(Facade模式)

Java设计模式(12)迭代模式(Iterator模式)

Java设计模式(13)模板模式(Template模式)

Java设计模式(14)责任链模式(Chain of Responsibility模式)

Java设计模式(15)备忘录模式(Memento模式)

Java设计模式(16)中介模式(Mediator模式)

Java设计模式(17)解释器模式(Interpreter模式)

Java设计模式(18)策略模式(Strategy模式)

Java设计模式(19)状态模式(State模式)

Java设计模式(20)观察者模式(Observer模式)

Java设计模式(21)访问模式(Visitor者模式)

Java设计模式(22)命令模式(Command模式)

Java设计模式(18)策略模式(Strategy模式)的更多相关文章

  1. java设计模式-----18、职责链模式

    概念: Chain of Responsibility(CoR)模式也叫职责链模式.责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的 ...

  2. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  3. Java设计模式(21)访问模式(Visitor者模式)

    Visitor定义:作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作. 在Java中,Visitor模式实际上是分离了collection结构中的元 ...

  4. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  5. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  6. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  7. Java设计模式(15)备忘录模式(Memento模式)

    Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...

  8. Java设计模式(13)模板模式(Template模式)

    Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: pu ...

  9. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  10. Java设计模式(11)外观模式(Facade模式)

    外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...

随机推荐

  1. Linux创建系统用户

    #!/bin/bash users_home_front_dir="/data/users/" ssh_user=$1 user_group=$2 server_user_path ...

  2. 关于iReport-5.6.0之前版本 “无法启动”或者“一开就关闭”的 某些原因

    在经过Google搜索后.外国的大神说: We don't support Java 8 right now. Support will be added in next versions. 大概意思 ...

  3. mybatis 对象关系映射例子

    入门 http://legend2011.blog.51cto.com/3018495/908956 增删改 http://legend2011.blog.51cto.com/3018495/9130 ...

  4. Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)

    1.基本参数与使用 1.1 常规介绍 使用预计算光照需要在Window/Lighting面板下找到预计算光照选项,保持勾选预计算光照并保证场景中有一个光照静态的物体 此时在编辑器内构建后,预计算光照开 ...

  5. .NET CORE2.0发布后没有 VIEWS视图页面文件

    以前做的CORE1.0的项目,发布的时候有views文件夹的,升级VS后用CORE2.0做项目,发布后没有views文件夹了,全编译到一个类似于Niunan.ZYYCY.Web.Precompiled ...

  6. 每天一个linux命令(3):du命令

    Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是查看当前指定文件或目录(会递归显示子目录)占用磁盘空间大小,还是和df命令有一些区别的. 1.命令格式: du [选 ...

  7. Gitlab日常备份和恢复

    按照官方安装文档安装完成之后的/home/git目录结构如下,这里我大致翻译官方的内容,部分加上自己的话,英语功力捉急,请见谅 |-- home | |-- git | |-- .ssh | |-- ...

  8. mac下增加eclipse内存

    在mac上找不到eclipse.ini文件编辑内存限制,在eclipse安装目录右击eclipse程序,选“显示包内容”,eclipse.ini就在 Content/MacOS下.

  9. 【转】mysqldump的锁表的问题

    今天凌晨,公司的一台MySQL生产库备份时间从2:30一直备份到8:30,正常情况下这个备份应该只会备份20分钟,3:00之前就会备份完毕,但是这次备份时间太长了,也影响了公司业务的使用.先写一下公司 ...

  10. js把预定义的html字符串转换为 HTML 实体 htmlspecialchars 输出html实体内容包括标签,而不自动转义标签,只显示内容,类似php的htmlspecialchars

    一.html字符串转换为 HTML 实体 htmlspecialchars function htmlspecialchars(str){                      str = str ...