1.问题来源:
在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
2.定义:定义一系列的算法,并且把每个算法都封装起来,使他们可以互相替换。本模式使得算法可独立于使用它的客户而变化,也叫作政策模式。
3.结构图示:
4.代码示例
本示例是一个商场的促销打折问题,商场有不同的营销手段,可以打折,也可以满减。这是两种不同的算法,适合使用策略模式。
cashsuper类:(strategy)
public abstract class cashsuper {
public abstract double getResult(double money);
}
cashNomal全价:(ConcreteStrategyA)
public class cashNormal extends cashsuper{
public double getResult(double money){
return money;
}
}
cashRebate打折:(ConcreteStrategyB)
public class cashRebate extends cashsuper{
private double moneyRebate;
public cashRebate(double moneyRebate){
this.moneyRebate = moneyRebate;
}
public double getResult(double money){
return money*moneyRebate;
}
}
cashReturn满减:(ConcreteStrategyC)
public class cashReturn extends cashsuper{
double moneyCondition,moneyReturn;
public cashReturn(double moneyCondition,double moneyReturn){
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
public double getResult(double money){
if(money>=moneyCondition){
return money-moneyReturn;
}
return money;
}
}
cashContext类:(context)
此类要单独说明,此代码已经结合使用了简单工厂模式
如果是单纯使用策略模式,那么会将算法的选择交给客户端完成,代码冗余,此处将算法的选择交给了Context类来完成。
public class cashContext {
public cashsuper cas = null;
public cashContext(String type){
switch(type){
case "正常收费":
cas = new cashNormal();
break;
case "满300送100":
cas = new cashReturn(300,100);
break;
case "打八折":
cas = new cashRebate(0.8);
break;
}
}
public double getResult(double money){
return cas.getResult(money);
}
}
Test测试:
public class client {
public static void main(String args[]){
// cashContext a = new cashContext("打八折");
// cashContext a = new cashContext("满300送100");
cashContext a = new cashContext("正常收费");
double money = 900.0;
System.out.println(a.getResult(money));
}
}
测试结果:
900.0