例如:商场促销手段有打折返利积分,都是一些算法。
    使用工厂来生成算法对象没有问题,但是这些算法是随时可以互相替换的,这是变化点:
    image.png

    1. #include<iostream>
    2. #include<memory>
    3. /* 抽象算法类 */
    4. class Strategy {
    5. public:
    6. virtual void AlgorithmInterface() = 0;
    7. virtual ~Strategy() = default;
    8. };
    9. /* 具体算法A */
    10. class ConcreteStrategyA final : public Strategy {
    11. public:
    12. ConcreteStrategyA() = default;
    13. void AlgorithmInterface() override {
    14. std::cout << "algo A implement\n";
    15. }
    16. };
    17. /* 具体算法B */
    18. class ConcreteStrategyB final : public Strategy {
    19. public:
    20. ConcreteStrategyB() = default;
    21. void AlgorithmInterface() override {
    22. std::cout << "algo B implement\n";
    23. }
    24. };
    25. /* 具体算法C */
    26. class ConcreteStrategyC final : public Strategy {
    27. public:
    28. ConcreteStrategyC() = default;
    29. void AlgorithmInterface() override {
    30. std::cout << "algo C implement\n";
    31. }
    32. };
    33. /* 上下文 */
    34. class Context final {
    35. public:
    36. Context() = default;
    37. explicit Context(Strategy* strategy) : strategy_(strategy) {}
    38. Context& operator=(Context&& context) {
    39. strategy_ = std::move(context.strategy_);
    40. return *this;
    41. }
    42. void ContextInterface() {
    43. strategy_->AlgorithmInterface();
    44. }
    45. private:
    46. std::unique_ptr<Strategy> strategy_;
    47. };
    48. auto main(void) -> int {
    49. Context context(new ConcreteStrategyA);
    50. context.ContextInterface();
    51. context = Context(new ConcreteStrategyB);
    52. context.ContextInterface();
    53. context = Context(new ConcreteStrategyC);
    54. context.ContextInterface();
    55. }

    策略模式的 Strategy 层次为 Context 定义了一系列可供重用的算法或行为继承有助于析取出这些算法中的公共部分