跳到主要内容

前言

策略模式在二十三种设计模式中属于行为型模式,它的核心思想是,我们有不同的方式能达到最终的目标,这些方式就好比一个又一个的行为,我们可以任意的替换,最终达到目标

传统模式

小明和小红是去同样一家超市购买物品,然后小红是会员,可以打8折,而小明不是会员,不能打折,只能原价购买,这里就是两套不同的优惠方案

image.png

我们如果不使用策略模式,我们就会使用if else等条件判断语句,来决定要走哪个优惠方案。

代码实现

   public static void main(String[] args){
System.out.println("小明(普通用户)去超市买东西");
double price = 30.00;
System.out.println("小明总价格为"+price+"元");
System.out.println("超市决定优惠方案....");
double planPrice = plan(price, "普通用户");
System.out.println("小明最终花了"+planPrice+"元");
System.out.println("----------------------");
System.out.println("小红(会员用户)去超市买东西");
price = 30.00;
System.out.println("小红总价格为"+price+"元");
System.out.println("超市决定优惠方案....");
planPrice = plan(price, "会员用户");
System.out.println("小红最终花了"+planPrice+"元");
}
public static double plan(double price,String level){
if("会员用户".equals(level)){
return 0.8 * price;
}
return price;
}
//小明(普通用户)去超市买东西
//小明总价格为30.0元
//超市决定优惠方案....
//小明最终花了30.0元
//----------------------
//小红(会员用户)去超市买东西
//小红总价格为30.0元
//超市决定优惠方案....
//小红最终花了24.0元

这个时候,如果超市想推出一个的新的会员---超级会员,这个会员他能享受七折的待遇,我们必须要在原有的代码上进行更改,也就是修改plan方法,这个时候我们就必须更改原先的代码,才能实现新的优惠方案,那如果我们超市又又又推出一个会员呢?或者推出一个新的活动例如满减活动,这个时候我们可以采用策略模式

    public static double plan(double price,String level){
if("会员用户".equals(level)){
return 0.8 * price;
}else if("超级会员".equals(level)){
return 0.7 * price;
}
return price;
}

策略模式

同样是上面那个场景,那我们用策略模式该怎么去实现呢?

image.png

代码实现

//抽象策略
public interface IStrategy {
double plan(double price);
}
//普通用户策略
public class PuTongStrategy implements IStrategy{
@Override
public double plan(double price) {
return price;
}
}
//会员策略
public class VIPStrategy implements IStrategy{
@Override
public double plan(double price) {
return 0.8 * price;
}
}
//测试
public static void main(String[] args){
System.out.println("小明(普通用户)去超市买东西");
double price = 30.00;
System.out.println("小明总价格为"+price+"元");
System.out.println("超市决定优惠方案....");
IStrategy IStrategy = new PuTongStrategy();
double planPrice = IStrategy.plan(price);
System.out.println("小明最终花了"+planPrice+"元");
System.out.println("----------------------");
System.out.println("小红(会员用户)去超市买东西");
System.out.println("小红总价格为"+price+"元");
System.out.println("超市决定优惠方案....");
IStrategy = new VIPStrategy();
planPrice = IStrategy.plan(price);
System.out.println("小红最终花了"+planPrice+"元");
}
//小明(普通用户)去超市买东西
//小明总价格为30.0元
//超市决定优惠方案....
//小明最终花了30.0元
----------------------
//小红(会员用户)去超市买东西
//小红总价格为30.0元
//超市决定优惠方案....
//小红最终花了24.0元

优化

这里可以看到我们的测试类内容十分奇怪,我们真正使用也并不是这样子使用的,我们通常会再包装一层,例如在这里,我们一般使用一个收银台类用于决定我们到底要使用哪种方案,也就是下面这样

image.png

只看图我们还是难以理解,其实非常简单,就是封装一个类,这个类有一个属性(策略)和一个对外的方法(获取价格)

//收银台类
public class Cashier {
//策略
private IStrategy iStrategy;

public Cashier(IStrategy iStrategy){
this.iStrategy = iStrategy;
}

//根据策略获得价格
public double getPriceByIStrategy(double price){
return iStrategy.plan(price);
}
}
//测试
public static void main(String[] args){
System.out.println("小明(普通用户)去超市买东西");
double price = 30.00;
System.out.println("小明总价格为"+price+"元");
System.out.println("收银台决定优惠方案....");
Cashier cashier = new Cashier(new PuTongStrategy());
double planPrice = cashier.getPriceByIStrategy(price);
System.out.println("小明最终花了"+planPrice+"元");
System.out.println("----------------------");
System.out.println("小红(会员用户)去超市买东西");
System.out.println("小红总价格为"+price+"元");
System.out.println("收银台决定优惠方案....");
cashier = new Cashier(new VIPStrategy());
planPrice = cashier.getPriceByIStrategy(price);
System.out.println("小红最终花了"+planPrice+"元");
}

总结

我们按照策略模式这样去操作,这样即使我们有新的优惠方案,我们也不需要去修改之前的代码了,我们直接去实现IStrategy接口,即可实现,而在收银台这里,只需要根据不同的策略去进行价格的优惠即可

看到这里,你应该对于策略模式有一个更加全新的认识了,也明白了策略模式到底该怎么嵌入到项目当中,设计模式博大精深有的时候我们很可能考虑不到,一般情况下,我们还是会使用if else,这样,毕竟再编写这么多类,这样项目看起来太臃肿了,并且,可读性不如if else,但是设计模式这种东西属于程序员的内功,我们要学习里面的思想,只有学会的这种思想,我们才能成为一个更加优质的程序员