22 【行为型】策略模式-Strategy

实际项目:
1、有各种鸭子,各个鸭子不同行为,显示出来;
2、商场打折、促销满减、积分兑换等活动

基本介绍:
1、策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
2、这算法体现了几个设计原则:
  • 把变化的代码从不变的代码中分离出来;
  • 针对接口编程而不是具体类(定义了策略接口)
  • 多组合/聚合少用继承(客户通过组合方式使用策略);

原理类图:
/*
 * @Description: 
 * @Remark: 
 * @Author: whl
 * @博客园: https://www.cnblogs.com/cnwhl/
 * @Date: 2021-12-21 15:40:40
 * @LastEditTime: 2021-12-28 21:13:11
 */
#include <iostream>

using namespace std;

/**
 * @description: 策略接口类
 * @Remark: 定义所有算法或者行为的抽象接口
 */
class Strategy
{
public:
    virtual void StrategyInterface() = 0;
};

/**
 * @description: 具体策略实现类
 * @Remark: 实现具体的算法或者行为,继承于Strategy类
 */
class ConcreteStrategyA: public Strategy
{
public:
    void StrategyInterface()
    {
        cout << "A 算法实现" << endl;
    }
};

class ConcreteStrategyB: public Strategy
{
public:
    void StrategyInterface()
    {
        cout << "B 算法实现" << endl;
    }
};

class ConcreteStrategyC: public Strategy
{
public:
    void StrategyInterface()
    {
        cout << "C 算法实现" << endl;
    }
};

/**
 * @description: Context上下文
 * @Remark: 用一个ContextStrategy来配置,维护一个对Strategy对象的引用
 */
class StrategyContext
{
public:
    StrategyContext(Strategy* pContext)
    {
        m_pStrategy = pContext;
    }

    void ContextStrategy(){
        m_pStrategy->StrategyInterface();
    }

private:
    Strategy* m_pStrategy;
};

int main()
{
    ConcreteStrategyA* pA = new ConcreteStrategyA();
    ConcreteStrategyB* pB = new ConcreteStrategyB();
    ConcreteStrategyC* pC = new ConcreteStrategyC();
    StrategyContext* pStrategyContext = NULL;

    pStrategyContext = new StrategyContext(pA);
    pStrategyContext->ContextStrategy();

    pStrategyContext = new StrategyContext(pB);
    pStrategyContext->ContextStrategy();

    pStrategyContext = new StrategyContext(pC);
    pStrategyContext->ContextStrategy();

    return 0;
}

思路分析:
1、“商场收银时如何促销,用打折还是返利,其实都是一些算法,用工厂来生成算法对象,这没有错,但算法本身只是一种策略,最重要的是这些算法是随时都可能互相替换的,这就是变化点,而封装变化点是我们面向对象的一种很重要的思维方式
2、策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合
3、优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试;
4、结合工厂模式和“反射技术”,策略模式应用起来会更加方便;

注意事项和细节:
1、策略模式的关键是:分析项目中变化部分与不变部分;
2、核心思想:多用组合/聚合,少用继承,用行为类组合,而不是行为的继承,更有弹性;
3、体现了“开闭原则”,客户端增加行为不用修改原有代码,只是增加一种策略(行为)即可;避免了使用多重转移语句(if else)
4、提供了可以替换继承关系的办法:策略模式将算法封装在独立的strategy类中使你可以独立于其context改变它,是他易于切换,易于理解,易于扩展;
5、注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大;






posted @ 2021-12-28 21:26  sfwhl  阅读(57)  评论(0)    收藏  举报