先说下定义:
策略模式(strategy):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不影响到算法的客户。
举个例子
做一个商场的收银软件,根据客户购买的商品的单价和数量想客户收费,有可能会有打折等营销策略。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
double price = scanner.nextDouble();
double result = price * num;
System.out.println(result);
}
上面的例子如果打折或者是满减还要修改代码
所以我们这里使用策略模式来处理
package wcfb.strategy;
public interface CashSuper {
double acceptCash(double money);
}
package wcfb.strategy;
/**
* 正常收费
*/
public class CashNormal implements CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
package wcfb.strategy;
/**
* 打折收费,默认7折
*/
public class CashRebate implements CashSuper {
int r = 7;
@Override
public double acceptCash(double money) {
return money/10*r;
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
}
package wcfb.strategy;
/**
* 满金额返现(满300反30)
*/
public class CashReturn implements CashSuper {
@Override
public double acceptCash(double money) {
return money - ((int) (money / 300)) * 30;
}
}
package wcfb.strategy;
public class CashContext {
private static CashSuper cashSuper;
public static double getResult(double money, int type){
switch (type) {
case 1:
cashSuper = new CashNormal();
break;
case 2:
cashSuper = new CashReturn();
break;
case 3:
cashSuper = new CashRebate();
break;
}
return cashSuper.acceptCash(money);
}
}
package wcfb.strategy;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (true){
System.out.println("请输入收费金额 -1 退出");
double money = in.nextDouble();
if (money == -1) {
return;
}
System.out.println("请输入计算方式(1.正常 2.满300反30 3.打7折)");
int type = in.nextInt();
System.out.println(CashContext.getResult(money, type));
}
}
}
运行截图

总结一下:策略模式是一种定义一系列算法的方法,从概念上看,所有这些算法完成都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各类算法类与使用算法类之间的耦合。
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
策略模式的有点是简化单元测试,因为每个算法都有自己的类,可以通过自己的接口单独的测试。
当不同的行为堆在一个类中,就很难避免使用条件语句来选择合适的行为,将这些行为封装成一个个单独的strategy类中,可以避免使用这些行为的类中消除条件语句。
策略模式就是用来封装算法的,但是在实践中我们可以发现它是来封装几乎任何类型的规则,只要在分析过程中听到所需要在不同时间应用不同的业务规则,我们就可以考虑使用策略模式处理这种变化的可能性。
在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。
但是任何需求的变更都是需要成本的。
网友评论