一、策略模式的意图

        定义一系列算法,把它们一个个封装起来,并使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化

Q:策略模式的特点

A:

  1. 具体算法从具体的业务方法中独立出来
  2. 策略模式是同行为的不同实现

Q:什么时候使用策略模式

A:多个if-else使用策略模式

二、类图

设计模式-行为型—策略模式-Strategy_策略模式

编辑

三、代码案例

收费对象类

public class CashContext {
    private CashStrategy cashStrategy;

    public double getMoney(double money) {
        return cashStrategy.acceptCash(money);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

收费策略接口

public interface CashStrategy { double acceptCash(double money); }
  • 1.

正常收费类

public class NormalCash implements CashStrategy {
    @Override
    public double acceptCash(double money) {
        return money;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

打折收费类

public class RebateCash implements CashStrategy {
    private double discounts = 10;

    @Override
    public double acceptCash(double money) {
        return money * discounts / 10;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

返利收费类

public class ReturnCash implements CashStrategy {
    private double condition = 0;
    private double rebate = 0;

    @Override
    public double acceptCash(double money) {
        if (money >= condition) {
            money -= Math.floor(money / condition) * rebate;
        }
        return money;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

演示类

public class Demo {
    public static void main(String[] args) {
        String discounts = "满300减100";
        CashContext cc = new CashContext();

        switch (discounts) {
            case "正常收费":
                cc.setCashStrategy(new NormalCash());
                break;
            case "打9折":
                cc.setCashStrategy(new RebateCash(9));
                break;
            case "满300减100":
                cc.setCashStrategy(new ReturnCash(300, 100));
                break;
        }

        double price = 400;
        double money = cc.getMoney(price);

        System.out.println("优惠后的费用为:" + money);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.