闲话少叙,直接切入正题,开始说说策略模式;
所谓的策略模式,它封装了一族算法,使它们之间可以互相的替换,而对使用算法的用户来说不会受到影响,其实,说不受到影响是指用户代码的模式是一致的,即不用改变使用习惯。
1. 策略的抽象 Strategy
1.1. 策略 StrategyA
1.2. 策略 StrategyB
2. 上下文环境 Context,对其初始化一个指定的策略,让后启动该环境,则得到预期的结果;这个初始化和
启动的流程对用户来说是不变的,只是改变初始的具体策略而已,如选则 A 或者 B。
代码实例:
1. strategy.h
- #ifndef _STRATEGY_H_
- #define _STRATEGY_H_
- class Strategy
- {
- public:
- virtual void AlgorithmInterface() = 0;
- };
- #endif
2. strategyA.h
- #ifndef _STRATEGY_A_H_
- #define _STRATEGY_A_H_
- #include "strategy.h"
- class StrategyA : public Strategy
- {
- public:
- void AlgorithmInterface();
- };
- #endif
3. strategyA.cpp
- #include <iostream>
- #include "strategyA.h"
- void StrategyA::AlgorithmInterface()
- {
- std::cout << "stategy A be called" << std::endl;
- }
4. strategyB.h
- #ifndef _STRATEGY_B_H_
- #define _STRATEGY_B_H_
- #include "strategy.h"
- class StrategyB : public Strategy
- {
- public:
- void AlgorithmInterface();
- };
- #endif
5. strategyB.cpp
- #include <iostream>
- #include "strategyB.h"
- void StrategyB::AlgorithmInterface()
- {
- std::cout << "stategy B be called" << std::endl;
- }
6. context.h
- #ifndef _CONTEXT_H_
- #define _CONTEXT_H_
- #include "strategy.h"
- class Context
- {
- public:
- Context(Strategy* s);
- void ContextInterface();
- private:
- Strategy* m_ps;
- };
- #endif
7. context.cpp
- #include <iostream>
- #include "context.h"
- Context::Context(Strategy* s)
- {
- m_ps = s;
- }
- void Context::ContextInterface()
- {
- m_ps->AlgorithmInterface();
- }
8. test.cpp
- #include <iostream>
- #include "strategy.h"
- #include "strategyA.h"
- #include "strategyB.h"
- #include "context.h"
- int main(int argc, char* args[])
- {
- Strategy* sa = new StrategyA();
- Strategy* sb = new StrategyB();
- Context ca(sa);
- Context cb(sb);
- ca.ContextInterface();
- cb.ContextInterface();
- delete sa;
- delete sb;
- }
执行结果:
- ./test
- stategy A be called
- stategy B be called
发现,策略模式 和 简单工厂 以及 工厂方法 有很大的相似性,可以说是二者的一个结合品;这里的策略如
同产品,工厂如同环境,只不过,策略模式送入的是真正的策略,而简单工厂送入的是说明;而工厂方法留给
用户选择的则是具体的 creator,不同的 creator 生产不同的产品。
好了,就说这么多,欢迎拍砖 ^-^
阅读(1816) | 评论(0) | 转发(0) |