示例问题:
一个问题,有三种解决方法,每种解决方法,适用于不同的场景,灵活设计切换每种解决方法来解决该问题,并可新增解决方法。
分析:
要能灵活的切换解决问题的方法,且能够灵活新增方法。
解决方案:
Strategy.h
在该文件中,实现了策略的基类,及三个策略的子类
#pragma once
#include <iostream>
//策略基类
class IStrategy
{
public:
IStrategy()
{
}
virtual ~IStrategy()
{
}
virtual void AlgorithmInterface() = 0;
};
//策略A类
class CConcreteStrategyA : public IStrategy
{
public:
CConcreteStrategyA()
{
}
virtual ~CConcreteStrategyA()
{
}
void AlgorithmInterface()
{
std::cout << "算法A执行" << std::endl;
}
};
//策略B类
class CConcreteStrategyB : public IStrategy
{
public:
CConcreteStrategyB()
{
}
virtual ~CConcreteStrategyB()
{
}
void AlgorithmInterface()
{
std::cout << "算法B执行" << std::endl;
}
};
//策略C类
class CConcreteStrategyC : public IStrategy
{
public:
CConcreteStrategyC()
{
}
virtual ~CConcreteStrategyC()
{
}
void AlgorithmInterface()
{
std::cout << "算法C执行" << std::endl;
}
};
Question.h
问题类
#pragma once
#include "Strategy.h"
class CQuestion
{
public:
CQuestion()
{
}
virtual ~CQuestion()
{
}
void SetStrategy(IStrategy* pStrategy)
{
m_pStrategy = pStrategy;
}
void Solve()
{
m_pStrategy->AlgorithmInterface();
}
private:
IStrategy* m_pStrategy;
};
main.cpp
// main.cpp : 定义控制台应用程序的入口点。
//
#include "Question.h"
int main()
{
CQuestion Question;
//用策略A解决该问题
IStrategy* pStrategyA = new(std::nothrow) CConcreteStrategyA();
if (nullptr != pStrategyA)
{
Question.SetStrategy(pStrategyA);
Question.Solve();
delete pStrategyA;
pStrategyA = nullptr;
}
//用策略B解决该问题
IStrategy* pStrategyB = new(std::nothrow) CConcreteStrategyB();
if (nullptr != pStrategyB)
{
Question.SetStrategy(pStrategyB);
Question.Solve();
delete pStrategyB;
pStrategyB = nullptr;
}
//用策略C解决该问题
IStrategy* pStrategyC = new(std::nothrow) CConcreteStrategyC();
if (nullptr != pStrategyC)
{
Question.SetStrategy(pStrategyC);
Question.Solve();
delete pStrategyC;
pStrategyC = nullptr;
}
system("pause");
return 0;
}
运行结果
策略模式的使用:
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,他可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。如果要新增解决问题的方法,只需新增新的策略子类。
何时使用策略模式:
在不同场景下需要切换不同的解决问题的方法。
返回目录:设计模式(C++实现)(总)