1 //==========================================
2 //strategy.h
3 //==========================================
4 #pragma once
5
6 class Strategy;
7 class Context
8 {
9 public:
10 Context(Strategy* pStrategy);
11 ~Context();
12 void SetStrategy(Strategy* pStrategy);
13 void Request();
14 private:
15 Strategy* m_pStrategy;
16 };
17
18 class Strategy
19 {
20 public:
21 virtual ~Strategy(){}
22 virtual void AlgorithmInterface() = 0;
23 };
24
25 class ConcreteStrategyA : public Strategy
26 {
27 public:
28 void AlgorithmInterface();
29 };
30
31 class ConcreteStrategyB : public Strategy
32 {
33 public:
34 void AlgorithmInterface();
35 };
36
37 //==========================================
38 //strategy.cpp
39 //==========================================
40 #include "strategy.h"
41 #include <iostream>
42 using namespace std;
43
44 Context::Context(Strategy* pStrategy)
45 :m_pStrategy(pStrategy)
46 {
47 }
48
49 Context::~Context()
50 {
51 delete m_pStrategy;
52 }
53
54 void Context::SetStrategy(Strategy* pStrategy)
55 {
56 delete m_pStrategy;
57 m_pStrategy = pStrategy;
58 }
59
60 void Context::Request()
61 {
62 if (NULL != m_pStrategy)
63 {
64 m_pStrategy->AlgorithmInterface();
65 }
66 }
67
68 void ConcreteStrategyA::AlgorithmInterface()
69 {
70 cout<<"ConcreteStrategyA::AlgorithmInterface()"<<endl;
71 }
72
73 void ConcreteStrategyB::AlgorithmInterface()
74 {
75 cout<<"ConcreteStrategyB::AlgorithmInterface()"<<endl;
76 }
77
78 int main()
79 {
80 Context ctx(new ConcreteStrategyA);
81 ctx.Request();
82 ctx.SetStrategy(new ConcreteStrategyB);
83 ctx.Request();
84
85 return 0;
86 }