01.策略模式 【STRATEGY PATTERN】

来源:互联网 发布:万人网络营销软件站 编辑:程序博客网 时间:2024/06/08 19:03

推荐文章:http://www.jellythink.com/archives/388

内容节选自推荐文章中:

类图:


类解读:

Strategy:定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法;
ConcreteStrategy:实现Strategy接口的具体算法;
Context:使用一个ConcreteStrategy对象来配置;维护一个对Stategy对象的引用,同时,可以定义一个接口来让Stategy访问它的数据。

适用范围解读:

  1. 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法;
  2. 需要使用一个算法的不同变体;
  3. 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构;
  4. 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。

实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
using namespacestd;
 
// The abstract strategy
classStrategy
{
public:
     virtualvoid AlgorithmInterface()= 0;
};
 
classConcreteStrategyA : publicStrategy
{
public:
     voidAlgorithmInterface()
    {
          cout<<"I am from ConcreteStrategyA."<<endl;
    }
};
 
class ConcreteStrategyB: publicStrategy
{
public:
    void AlgorithmInterface()
     {
          cout<<"I am from ConcreteStrategyB."<<endl;
     }
};
 
classConcreteStrategyC : publicStrategy
{
public:
     voidAlgorithmInterface()
    {
          cout<<"I am from ConcreteStrategyC."<<endl;
    }
};
 
class Context
{
public:
    Context(Strategy*pStrategyArg): pStrategy(pStrategyArg)
     {
    }
     voidContextInterface()
    {
          pStrategy->AlgorithmInterface();
    }
private:
    Strategy *pStrategy;
};
 
int main()
{
     // Create the Strategy
    Strategy *pStrategyA= newConcreteStrategyA;
     Strategy*pStrategyB= newConcreteStrategyB;
    Strategy *pStrategyC= newConcreteStrategyC;
     Context*pContextA= newContext(pStrategyA);
    Context *pContextB= newContext(pStrategyB);
     Context*pContextC= newContext(pStrategyC);
    pContextA->ContextInterface();
     pContextB->ContextInterface();
    pContextC->ContextInterface();
 
    if (pStrategyA)delete pStrategyA;
     if(pStrategyB)delete pStrategyB;
    if (pStrategyC)delete pStrategyC;
 
    if (pContextA)delete pContextA;
     if(pContextB)delete pContextB;
    if (pContextC)delete pContextC;
}

0 0
原创粉丝点击