在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
    在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
    使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

    策略接口

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-27 10:33
    5. */
    6. public interface Strategy {
    7. public abstract double sellWay(double money);
    8. }

    具体实现类 打折

    1. /**
    2. * @author meikb
    3. * @desc 销售方式是打折
    4. * @date 2020-05-27 10:35
    5. */
    6. public class DiscountStrategy implements Strategy{
    7. @Override
    8. public double sellWay(double money) {
    9. return money * 0.8;
    10. }
    11. }

    销售方式是满减

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-27 10:35
    5. */
    6. public class FullSubStrategy implements Strategy{
    7. @Override
    8. public double sellWay(double money) {
    9. if(money >= 500){
    10. return money - 100;
    11. }
    12. return money;
    13. }
    14. }

    销售方式是原价

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-27 10:35
    5. */
    6. public class NormalStrategy implements Strategy{
    7. @Override
    8. public double sellWay(double money) {
    9. return money;
    10. }
    11. }

    结合工厂模式

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-27 10:40
    5. */
    6. public class Context {
    7. public double execute(int type, double money){
    8. switch (type) {
    9. case 1:
    10. money = new NormalStrategy().sellWay(money);
    11. break;
    12. case 2:
    13. money = new DiscountStrategy().sellWay(money);
    14. break;
    15. case 3:
    16. money = new FullSubStrategy().sellWay(money);
    17. break;
    18. default:
    19. break;
    20. }
    21. return money;
    22. }
    23. }

    测试主函数

    1. /**
    2. * @author meikb
    3. * @desc
    4. * @date 2020-05-27 10:49
    5. */
    6. public class StrategyMain {
    7. public static void main(String[] args) {
    8. Context context = new Context();
    9. System.out.println(context.execute(1, 500));
    10. System.out.println(context.execute(2, 500));
    11. System.out.println(context.execute(3, 500));
    12. }
    13. }