C++设计模式~策略模式(Strategy)

商城促销的案例

1.简单工厂模式实现
在这里插入图片描述在这里插入图片描述
简单工厂模式我需要让客户端认识两个类,CashSuper和CashFactory

2.策略模式+简单工厂模式实现
在这里插入图片描述在这里插入图片描述
而策略模式我只需要给客户端暴露CashContext类即可,耦合更加降低了,

单纯策略模式代码举例

strategy.h

#ifndef STRATEGY_H
#define STRATEGY_H

class Strategy
{
public:
    Strategy();
    virtual void AlgorithmInterface() = 0;
};

class ConcreteStrategyA:public Strategy
{
public:
    ConcreteStrategyA() {}
    void AlgorithmInterface();
};

class ConcreteStrategyB:public Strategy
{
public:
    ConcreteStrategyB() {}
    void AlgorithmInterface();
};

class ConcreteStrategyC:public Strategy
{
public:
    ConcreteStrategyC() {}
    void AlgorithmInterface();
};

class Context
{
public:
    Context(Strategy *strategy);
    Strategy *strategy;
    void ContextInterface();
};
#endif // STRATEGY_H

strategy.cpp

#include "strategy.h"
#include <iostream>
using namespace std;

Strategy::Strategy()
{

}

void ConcreteStrategyA::AlgorithmInterface()
{
    cout<<"AlgorithmInterface of ConcreteStrategyA"<<endl;
}

void ConcreteStrategyB::AlgorithmInterface()
{
    cout<<"AlgorithmInterface of ConcreteStrategyB"<<endl;
}

void ConcreteStrategyC::AlgorithmInterface()
{
    cout<<"AlgorithmInterface of ConcreteStrategyC"<<endl;
}

//初始化的时候传入具体的策略对象
Context::Context(Strategy *strategy)
{
    this->strategy = strategy;
}

//再根据具体的策略对象来调用其算法接口
void Context::ContextInterface()
{
    this->strategy->AlgorithmInterface();
}

main.cpp

#include <iostream>
#include "strategy.h"

using namespace std;

int main()
{
    Context contextA(new ConcreteStrategyA());
    contextA.ContextInterface();

    Context contextB(new ConcreteStrategyB());
    contextB.ContextInterface();

    Context contextC(new ConcreteStrategyC());
    contextC.ContextInterface();

    return 0;
}

策略模式+简单工厂模式代码举例

strategy.h

#ifndef STRATEGY_H
#define STRATEGY_H

enum AlgorithmMode
{
    ALGORITHMA,
    ALGORITHMB,
    ALGORITHMC,
};


class Strategy
{
public:
    Strategy();
    virtual void AlgorithmInterface() = 0;
};

class ConcreteStrategyA:public Strategy
{
public:
    ConcreteStrategyA() {}
    void AlgorithmInterface();
};

class ConcreteStrategyB:public Strategy
{
public:
    ConcreteStrategyB() {}
    void AlgorithmInterface();
};

class ConcreteStrategyC:public Strategy
{
public:
    ConcreteStrategyC() {}
    void AlgorithmInterface();
};

class Context
{
public:
    Context(Strategy *strategy);//策略模式
    Context(int AlgorithmMode);//策略模式+简单工厂模式
    Strategy *strategy;
    void ContextInterface();
};
#endif // STRATEGY_H

strategy.cpp

#include "strategy.h"
#include <iostream>
using namespace std;

Strategy::Strategy()
{

}

void ConcreteStrategyA::AlgorithmInterface()
{
    cout<<"AlgorithmInterface of ConcreteStrategyA"<<endl;
}

void ConcreteStrategyB::AlgorithmInterface()
{
    cout<<"AlgorithmInterface of ConcreteStrategyB"<<endl;
}

void ConcreteStrategyC::AlgorithmInterface()
{
    cout<<"AlgorithmInterface of ConcreteStrategyC"<<endl;
}


//策略模式:初始化的时候传入具体的策略对象
Context::Context(Strategy *strategy)
{
    this->strategy = strategy;
}

//简单工厂模式:封装了对象的创建的接口
Context::Context(int AlgorithmMode)
{
    switch (AlgorithmMode) {
    case ALGORITHMA:
        this->strategy = new ConcreteStrategyA();
        break;

    case ALGORITHMB:
        this->strategy = new ConcreteStrategyB();
        break;

    case ALGORITHMC:
        this->strategy = new ConcreteStrategyC();
        break;

    default:
        this->strategy = nullptr;
        break;
    }
}

//再根据具体的策略对象来调用其算法接口
void Context::ContextInterface()
{
    this->strategy->AlgorithmInterface();
}

main.cpp

#include <iostream>
#include "strategy.h"

using namespace std;

int main()
{
    /***************策略模式**************/
    Context contextA(new ConcreteStrategyA());
    contextA.ContextInterface();

    Context contextB(new ConcreteStrategyB());
    contextB.ContextInterface();

    Context contextC(new ConcreteStrategyC());
    contextC.ContextInterface();

    /***********策略模式+工厂模式**********/
    Context contextA1(ALGORITHMA);
    contextA1.ContextInterface();

    Context contextB1(ALGORITHMB);
    contextB1.ContextInterface();

    Context contextC1(ALGORITHMC);
    contextC1.ContextInterface();

    return 0;
}

在这里插入图片描述
上述代码显示策略模式+工厂模式,客户端只要管理一个类:Context即可,调用的ContextInterface(),这样就彻底把算法和客户端分离出来了,耦合度更低

策略模式就是用来封装算法的,但在实践中,我们发现可以用来封装几乎任何类型的规则,只要在分析的过程中听到:需要在不同的时间对应不同的业务规则,就可以考虑用策略模式处理这种变化的可能性,但是在基本的策略模式中,选择所用的具体实现的职责由客户端对象承担,并转给策略模式的Context对象,这本身并没有解除客户端需要判断的压力,而策略模式+简单工厂模式后,选择具体实现的职责可以由Context来承担,这样就最大化的减轻了客户端的职责

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值