策略模式:它定义了算法家族,分别封装起来,让它们之间开源互相替代,此模式让算法的变化,不会影响到使用算法的客户。
运用场景:商场收银软件,营业员根据客户所购买的单价和数量,向客户收费。但是根据活动的不同,每次的价格都不一样。比如,全场打八折、全场打五折、满300减100等活动。如果用if-else作处理的话,就显得很累赘,加上如果拓展更多的活动,只能添加更多的分支。
CashContext类,是对策略的运用。
public class CashContext {
//维护着策略类的引用,调用策略,只需要设置不同的策略既可。
private CashSuper cashSuper;
public CashContext(CashSuper cashSuper){
this.cashSuper = cashSuper;
}
//设置不同的策略
public void setCashSuper(CashSuper cashSuper){
this.cashSuper = cashSuper;
}
//各个策略的不同实现
public double getResult(double money){
return cashSuper.acceptCash(money);
}
}
策略的抽象类
/**
* 策略的抽象方法,各个具体的策略会继承该接口实现具体的方法,该类就是strategy
*/
public interface CashSuper {
/**
* 计算实际的价格,有打折8折,有满减,有正常收费,三种情况对应着三个策略子类,对该方法的具体实现
* @param money 价格,传入商品的价格,返回各个活动后的价格
*/
public double acceptCash(double money);
}
具体实现的子类:
/**
* 正常价格,不打折
*/
public class CashNormal implements CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
/**
* 构建打折的子类,只需要传入不同的折扣就可以了
*/
public class CashRebate implements CashSuper{
private double rebate; //打折
public CashRebate(double rebate) {
this.rebate = rebate;
}
@Override
public double acceptCash(double money) {
return money * rebate;
}
}
/**
* 满减
*/
public class CashReduce implements CashSuper{
//满多少钱
private double targetMoney;
//减多少钱
private double reduceMoney;
public CashReduce(double targetMoney, double reduceMoney){
this.targetMoney = targetMoney;
this.reduceMoney = reduceMoney;
}
@Override
public double acceptCash(double money) {
if (money >= targetMoney){
return money - reduceMoney;
}else {
return money;
}
}
}
测试类:
public class StategyTest {
public static void main(String[] args) {
//正常价格
CashContext cashContext = new CashContext(new CashNormal());
double result = cashContext.getResult(80);
System.out.println("正常价格:" + result);
//满300减100,需要更多的满减,只需要创建不同构造函数的类就好了
CashReduce cashReduce = new CashReduce(300, 100);
//设置策略
cashContext.setCashSuper(cashReduce);
result = cashContext.getResult(300);
System.out.println("满300减100:" + result);
//所有的商品打八折
CashRebate cashRebate = new CashRebate(0.8);
//设置策略
cashContext.setCashSuper(cashRebate);
result = cashContext.getResult(100);
System.out.println("所有商品打八折:" + result);
}
}
解析:
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。