代码改变世界

策略模式

2019-02-27 16:29  剑动情缥缈  阅读(179)  评论(0编辑  收藏  举报

1.基本概念

  • 定义一系列算法,将算法接口封装到具有算法接口的策略类中,从而使得可以改变算法
  • 作用:将算法责任与策略类解耦,算法可以独立于策略类变化
  • 策略类仅封装算法,使用何种算法由客户端决定
  • UML

  

2.代码

package com.chengjie;

interface Strategy {
    void show();
}

class StrategyA implements Strategy {
    @Override
    public void show() {
        System.out.println("促销活动A!");
    }
}

class StrategyB implements Strategy {
    @Override
    public void show() {
        System.out.println("促销活动B!");
    }
}

class StrategyC implements Strategy {
    @Override
    public void show() {
        System.out.println("促销活动C!");
    }
}

enum NUM {A, B, C}

class SalesMan {
    private Strategy strategy;

    public SalesMan(NUM num) {
        switch (num) {
            case A:
                strategy = new StrategyA();
                break;
            case B:
                strategy = new StrategyB();
                break;
            case C:
                strategy = new StrategyC();
                break;
            default:
                strategy = null;
        }
    }

    public void salesManShow() {
        this.strategy.show();
    }

}

public class TestStrategyPattern {
    public static void main(String[] args) {
        SalesMan sm = null;
        //活动A
        sm = new SalesMan(NUM.A);
        sm.salesManShow();

        //活动B
        sm = new SalesMan(NUM.B);
        sm.salesManShow();
    }
}
View Code

3.优点

  • 符合开闭原则:增加一个新的算法只需要添加一个算法类即可,不需要对策略类做任何修改

4.缺点

  • 客户端需要知道所有算法,才可以选择使用哪个算法

5.应用场景

  • 复杂的算法场景
  • 变与不变分离:将变化的算法部分从类中独立出去

6.参考

  https://www.jianshu.com/p/0c62bf587b9c