您的位置:首页 > 其它

设计模式读书笔记:Strategy(策略)

2015-07-10 21:34 495 查看
意图:

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

结构图:来自 《23种设计模式 - 郗晓勇》



实现:https://github.com/panshiqu/patterns/tree/master/Strategy

Context

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

namespace NS_STRATEGY {

class Context {
public:
Context() : _strategy(0) {}
virtual ~Context() {}
void contextInterface(void)
{
int a, b;
std::cout << "a=";
std::cin >> a;
std::cout << "b=";
std::cin >> b;

if (_strategy)
_strategy->algorithmInterface(a, b);
}

void setStrategy(Strategy *strategy)
{
_strategy = strategy;
}

private:
Strategy *_strategy;
};

} /* namespace NS_STRATEGY */
Strategy

namespace NS_STRATEGY {

class Strategy {
public:
Strategy() {}
virtual ~Strategy() {}
virtual void algorithmInterface(int a, int b) = 0;
};

} /* namespace NS_STRATEGY */
ConcreteStrategyA

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

namespace NS_STRATEGY {

class ConcreteStrategyA : public Strategy
{
public:
ConcreteStrategyA() {}
virtual ~ConcreteStrategyA() {}
virtual void algorithmInterface(int a, int b)
{
std::cout << "a+b = " << a+b << std::endl;
}
};

} /* namespace NS_STRATEGY */
ConcreteStrategyB

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

namespace NS_STRATEGY {

class ConcreteStrategyB : public Strategy
{
public:
ConcreteStrategyB() {}
virtual ~ConcreteStrategyB() {}
virtual void algorithmInterface(int a, int b)
{
std::cout << "a-b = " << a-b << std::endl;
}
};

} /* namespace NS_STRATEGY */
main

#include "Strategy/Context.h"
#include "Strategy/ConcreteStrategyA.h"
#include "Strategy/ConcreteStrategyB.h"
using namespace NS_STRATEGY;
int main(void)
{
Context c;
ConcreteStrategyA csa;
ConcreteStrategyB csb;
c.setStrategy(&csa);
c.contextInterface();
c.setStrategy(&csb);
c.contextInterface();
}
附加:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: