策略模式,“策略”可以实现目标的方案集合。也就是说一件事情,有多种方法可以实现,但根据实际情况的不同,我们要用我们已知的不同方法去实现,即用不同策略应对不同的情况。注意,是已知的方法,也就是说,我们之前准备好的方法
如果是突发事件,策略就没有用了。这也是策略模式的一个弱点,就是随着情况的增多,我们相应的策略也要增多。
Strategy适合下列场合:
一、拿开发应用程序来讲
1.以不同的格式保存文件;
2.以不同的算法压缩文件;
3.以不同的算法截获图象;
4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等
二、拿企业业务来讲
比如我们做一个收购程序,要给不同的企业用,但不同的企业因各自的差异,他们收购的方式是不一样的。就拿给收购的产品订价这件事来讲吧,企业1订价的规则跟企业2订价规则是不一样的,可能还有企业3。。。。企业N。我们不可能用一个通用的代码来实现所有的这些企业的规则。那么可以用策略模式来做这件事,为每个企业实现不同的算法,在实际情况中调用相应的算法来给企业计算订价结果。(这个例子,想来想去都觉得不是很贴切,不过主要是理解,理解就好!)
写了一遍代码,加深记忆:
首先建立接口,定义功能
package dcr.study.dp.strategy;
public interface IPriceRule {
float getPrice(String conditions);
}
然后为不同的情况实现不同的算法
package dcr.study.dp.strategy;
public class PriceRuleOne implements IPriceRule {
public float getPrice(String conditions) {
return 1.3f;
}
}
package dcr.study.dp.strategy;
public class PriceRuleTwo implements IPriceRule {
public float getPrice(String conditions) {
return 2.3f;
}
}
package dcr.study.dp.strategy;
public class PriceRuleThree implements IPriceRule {
public float getPrice(String conditions) {
return 3.3f;
}
}
再弄个Context 来调用这些算法
package dcr.study.dp.strategy;
public class PriceRuleSolve {
private IPriceRule strategy;
public PriceRuleSolve(IPriceRule rule){
this.strategy = rule;
}
public float getPriceResult(String conditions){
return strategy.getPrice(conditions);
}
}
最后是实际的使用,根据不同的情况,通过Context调用不同的方法
package dcr.study.dp.strategy;
public class Application {
/**
* @param args
*/
public static void main(String[] args) {
PriceRuleSolve solve = new PriceRuleSolve(new PriceRuleOne());
solve.getPriceResult("input some conditions");
solve = new PriceRuleSolve(new PriceRuleTwo());
solve.getPriceResult("input some conditions");
}
}