5、[C++]策略模式

此目录下的内容均摘自 <大话设计模式>或其他资料

策略模式

回顾下简单工厂模式, 在最后的main函数中, 我们暴露了两个类, Operation类和Factory类.
能不能对这两个类进行再封装, 使其最暴露一个类就能写完main函数呢?
那就引入了策略模式.

策略模式

可以看到我们移除了简单工厂模式中的Factory类, 添加了一个OperContext类, 这个类用一个具体Operation来配置, 维护一个对Operation对象的引用.

 1 class OperContext {

 2 public:

 3     Operation* m_oper;

 4     double m_dNumA = 0.0;

 5     double m_dNumB = 0.0;

 6 

 7     OperContext(char cOp) {

 8         switch (cOp) {

 9         case '+':

10             m_oper = new OperationAdd();

11             break;

12         case '-':

13             m_oper = new OperationSub();

14             break;

15         case '*':

16             m_oper = new OperationMul();

17             break;

18         case '/':

19             m_oper = new OperationDiv();

20             break;

21         }

22     }

23 

24     double GetResult() {

25         m_oper->m_dNum_A = m_dNumA;

26         m_oper->m_dNum_B = m_dNumB;

27         return m_oper->GetResult();

28     }

29 };

30 

31 int _tmain(int argc, _TCHAR* argv[]) {

32     char cOp;

33     cout << "请输入操作符(+ - * / . . .):" << endl;

34     cin >> cOp;

35     OperContext* con = new OperContext(cOp);

36 

37     try {

38         cout << "请输入第一个数:" << endl;

39         cin >> con->m_dNumA;

40         cout << "请输入第二个数:" << endl;

41         cin >> con->m_dNumB;

42 

43         double dResult = con->GetResult();

44         cout << "结果是: " << dResult << endl;

45     }catch (...) {

46         cout << "请输入正确操作数" << endl;

47     }

48 

49     system("PAUSE");

50     return 0;

51 }

可以看到我们只暴露了一个OperContext类就能完成整个程序.

所谓的策略模式, 实现的就是Context环境类, 它可以理解成一个锦囊, 是一个装策略的地方, 又是策略的应用场景.

当然上面的策略模式并不是一个原始的策略模式原型, 它还结合了简单工厂模式, 在它的构造函数里通过传进的参数来生成具体的Operation对象.
而在原始的策略模式中, 这一步是在外面进行的, 在OperContext的构造中只是一个简单的赋值.

 1 class OperContext {

 2 public:

 3     Operation* m_oper = NULL;

 4     double m_dNumA = 0.0;

 5     double m_dNumB = 0.0;

 6 

 7     OperContext(Operation* oper) {

 8         m_oper = oper;

 9     }

10 

11     double GetResult() {

12         m_oper->m_dNum_A = m_dNumA;

13         m_oper->m_dNum_B = m_dNumB;

14         return m_oper->GetResult();

15     }

16 };

解析

策略模式是一种定义一系列算法的行为, 从概念上看, 所有这些算法完成的都是相同的工作, 只是实现不同, 它可以用相同的方式调用所有的算法, 减少了各种算法与使用算法类之间的耦合.

另一个策略模式的优点是简化了单元测试, 因为每个算法都有自己的类, 可以通过自己的接口单独测试, 修改其中一个时也不会影响其他的算法.

总结

策略模式就是用来封装算法的, 在实践中, 只要遇到需要在不同时间应用不同算法的情景, 就可以考虑使用策略模式来处理.

你可能感兴趣的:(策略模式)