posts - 262,  comments - 221,  trackbacks - 0
注:本文参考了《Java设计模式》一书和WWW.jdon.com网站的《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;

}

·继承子类:
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;
  }

}

三、Strategy模式的特点:

·有一个抽象的父类/接口,在其中定义了操作的模板(类似于Template模式)
·有一至多个实现类或子类,实现了父类/接口中的模板方法
·有一个可供客户端动态切换算法的帮助类,该类拥有一个策略对象,可以在初始化时指定默认的策略,也可以在运行时通过set方法动态切换策略

四、Strategy模式与其它模式的比较:

·Strage模式与State模式的比较

在对状态进行建模时,状态的迁移是一个重要的方面(即如何切换到上、下一个状态);而在对策略进行建模时,迁移与策略的选择并不相关(即关注的是操作的策略,对象状态的切换并不是关注的方面)。

另外一个不同之处就是,Strategy模式可能允许客户选择或者提供一个策略,而State模式却很少设计这样的思路。

·Strategy模式与Template模式的比较

Strategy模式的最大特点是可以在运行期间动态地切换算法。这一点和“Template”模式有点不同,后者虽然也提供抽象的模板框架,并且由子类继承实现,Template模式一般在确定之后的运行期间就不会再次切换了。而前者可以或者说需要在运行期间动态地切换

五、Strategy模式的适用场合:

1.以不同的格式保存文件;

2.以不同的算法压缩文件;

3.以不同的算法截获图象;

4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等



-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-04-08 11:52 Paul Lin 阅读(5335) 评论(2)  编辑  收藏 所属分类: 模式与重构


FeedBack:
# re: 设计模式总结-Strategy模式
2008-04-13 09:23 | applupus
帮助类的代码是不是有问题?
return strategy.replace(site,oldString);

策略中的方法是replace(),是不带参数的。  回复  更多评论
  
# re: 设计模式总结-Strategy模式[未登录]
2012-04-02 13:13 | vince
这个例子做Strategy不太合适  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜