c++ 设计模式之策略模式及实现demo

关键在于将算法的逻辑抽象接口(DoAction)封装到一个类中(Context),再通过委托的方式具体的算法实现委托给具体的strategy类来实现(ConcreteStrategyA类)

 

Context封装角色

它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

Strategy抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

ConcreteStrategy具体策略角色

实现抽象策略中的操作,该类含有具体的算法

 

实现demo

class Strategy
{
public:
    Strategy();
    virtual ~Strategy();
    virtual void AlgrithmInterface()=0;
protected:
private:
};

class ConcereteStrategyA :public Strategy
{
public:
    ConcereteStrategyA();
    virtual ~ConcereteStrategyA();
    virtual void AlgrithmInterface();
protected:
private:
};

class ConcereteStrategyB :public Strategy
{
public:
    ConcereteStrategyB();
    virtual ~ConcereteStrategyB();
    virtual void AlgrithmInterface();
protected:
private:
};

class Context
{
public:
    Context(Strategy *pStrategy);
    ~Context();
    void DoAction();
protected:
private:
    Strategy *m_pStratey;
};

 

#include "Strategy.h"
#include <iostream>
Strategy::Strategy()
{
    std::cout << "Strategy..." << std::endl;
}

Strategy::~Strategy()
{
    std::cout << "~Strategy..." << std::endl;
}

ConcereteStrategyA::ConcereteStrategyA()
{
    std::cout << "ConcereteStrategyA..." << std::endl;
}

ConcereteStrategyA::~ConcereteStrategyA()
{
    std::cout << "~ConcereteStrategyA..." << std::endl;
}

void ConcereteStrategyA::AlgrithmInterface()
{
    std::cout << "ConcereteStrategyA AlgrithmInterface..." << std::endl;
}

ConcereteStrategyB::ConcereteStrategyB()
{
    std::cout << "ConcereteStrategyB..." << std::endl;
}

ConcereteStrategyB::~ConcereteStrategyB()
{
    std::cout << "ConcereteStrategyB..." << std::endl;
}

void ConcereteStrategyB::AlgrithmInterface()
{
    std::cout << "ConcereteStrategyB AlgrithmInterface..." << std::endl;
}

Context::Context(Strategy *pStrategy)
{
    m_pStratey = pStrategy;
}

Context::~Context()
{
    if (m_pStratey)
    {
        delete m_pStratey;
        m_pStratey = nullptr;
    }
}

void Context::DoAction()
{
    m_pStratey->AlgrithmInterface();
}

int main(int argc, char* argv[])
{
    Strategy *pStrategy = new ConcereteStrategyA();
    Context *pContext = new Context(pStrategy);
     pContext->DoAction();
     if (pContext)
     {
         delete pContext;
         pContext = nullptr;
     }

    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改変其行为。在状态模式中,对象将其状态封装在不同的类中,使其能够在运行时动态改变状态。 以下是一个状态模式的简单示例,演示了一个电梯的工作状态: ```C #include <iostream> using namespace std; class ElevatorState { public: virtual void goUp() = 0; virtual void goDown() = 0; }; class StoppedState : public ElevatorState { public: void goUp() override; void goDown() override { cout << "Elevator goes down.\n"; } }; class MovingState : public ElevatorState { public: void goUp() override { cout << "Elevator goes up.\n"; } void goDown() override { cout << "Elevator goes down.\n"; } }; class Elevator { public: Elevator() : state(new StoppedState) {} void setState(ElevatorState* newState) { state = newState; } void goUp() { state->goUp(); } void goDown() { state->goDown(); } private: ElevatorState* state; }; void StoppedState::goUp() { cout << "Elevator goes up.\n"; } int main() { Elevator elevator; elevator.goUp(); // Elevator goes up. elevator.setState(new MovingState); elevator.goUp(); // Elevator goes up. elevator.goDown(); // Elevator goes down. elevator.setState(new StoppedState); elevator.goDown(); // Elevator goes down. return 0; } ``` 在这个示例中,我们定义了两种电梯状态:StoppedState(停止状态)和MovingState(移动状态)。Elevator类维护一个当前状态的指针,并根据当前状态调用相应的方法。 我们可以看到,在执行Elevator::goUp()方法时,根据当前状态的不同,输出的结果也不同。当电梯处于StoppedState时,输出“Elevator goes up.”,而当电梯处于MovingState时,输出“Elevator goes down.”。 通过使用状态模式,我们可以很容易地改变电梯的状态,并且可以轻松地添加新的状态。这种模式使代码更容易维护,并且使其更具可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值