概念
在策略模式中,创建表示策略的对象Strategy和一个行为随着策略对象改变而改变的Context 对象。
- Context:持有抽象策略接口的引用
- Strategy:定义了算法的公共接口
- ConcreteStrategy:定义具体的算法
例子:
模拟一个超市商品打折活动的场景,定义抽象的策略接口
public interface CashSuper {
double getCash(double price, int number);
}
正常销售
/**
* 正常
*
*/
public class CashNormal implements CashSuper{
@Override
public double getCash(double price, int number) {
return price * number;
}
}
满200减100
/**
* 满200减100
*/
public class CashReturn implements CashSuper{
@Override
public double getCash(double price, int number) {
double totalPrice = price * number;
if(totalPrice >= 200){
return totalPrice - 100;
}else {
return totalPrice;
}
}
}
打八折
/**
* 打八折
*
*/
public class CashRate implements CashSuper{
@Override
public double getCash(double price, int number) {
return price * number * 0.8;
}
}
收银员根据具体的活动找零
public class Cashier {
private CashSuper cashSuper;
public Cashier(CashSuper cashSuper){
this.cashSuper = cashSuper;
}
public double handle(double price, int number){
return cashSuper.getCash(price, number);
}
}
客户端
public class Test {
public static void main(String args[]) {
double price = 30;
int number = 10;
Cashier cashier = new Cashier(new CashReturn());
System.out.println("找零:" + cashier.handle(price, number));
cashier = new Cashier(new CashNormal());
System.out.println("找零:" + cashier.handle(price, number));
cashier = new Cashier(new CashRate());
System.out.println("找零:" + cashier.handle(price, number));
}
}
优点:
- 增加新的策略,只需要实现抽象接口即可,体现了对修改关闭,对扩展开放的原则。
- 避免了多重的if-else判断
缺点:
- 客户端需要知道所有的策略
- 随着策略的增加,具体的策略类数量会越来越多