一个不恰当使用设计模式的例子

正确的使用设计模式可以减少条件语句,减少代码量,提高复用性。

错误的使用,则起不到那样的效果。

下面的例子,本想使用策略模式,封装是封装了,可以还是用的状态模式的思路,导致最终没有起到优化的目的。

原因还是选错了模式。

代码:

  1 #include <stdlib.h>
  2 
  3 /*** 
  4 * 一个非常不恰当的使用设计模式——策略模式的例子
  5 * 看起来就是状态模式和策略模式的杂交,还是畸形
  6 * @author:zanzan101
  7 */
  8 
  9 
 10 class Move
 11 {
 12 public:
 13     // 重载()运算符,使之成为仿函数
 14     virtual void operator() (int& i, int& j) = 0;
 15 };
 16 
 17 class MoveUp: public Move
 18 {
 19 public:
 20     void operator() (int& i, int& j)
 21     {
 22         i--;
 23     }
 24 };
 25 class MoveDown: public Move
 26 {
 27 public:
 28     void operator() (int& i, int& j)
 29     {
 30         i++;
 31     }
 32 };
 33 class MoveLeft: public Move
 34 {
 35 public:
 36     void operator() (int& i, int& j)
 37     {
 38         j--;
 39     }
 40 };
 41 class MoveRight: public Move
 42 {
 43 public:
 44     void operator() (int& i, int& j)
 45     {
 46         j++;
 47     }
 48 };
 49 
 50 
 51 class Snake
 52 {
 53 private:
 54     int* array;
 55     int rows;
 56     Move* move, *up, *down, *left, *right;
 57     int t, b, l, r;
 58 public:
 59 
 60     // 构造函数
 61     Snake(const int n): rows(n)
 62     {
 63         array = new int[n*n];
 64         up = new MoveUp();
 65         down = new MoveDown();
 66         left = new MoveLeft();
 67         right = new MoveRight();
 68         move = right;
 69         t = 0;
 70         b = n-1;
 71         l = 0;
 72         r = n-1;
 73     }
 74 
 75     // 处理函数
 76     void process()
 77     {
 78         int i = 0, j = 0, n = 0;
 79         while(n < rows*rows)
 80         {
 81             n++;
 82             array[i*rows + j] = n;
 83             if(i == t && j == r && move == right)
 84             {
 85                 move = down;
 86                 t++;
 87             }else if(i == b && j == r && move == down)
 88             {
 89                 move = left;
 90                 r--;
 91             }else if(i == b && j == l && move == left)
 92             {
 93                 move = up;
 94                 b--;
 95             }else if(i == t && j == l && move == up)
 96             {
 97                 move = right;
 98                 l++;
 99             }
100             (*move)(i, j);
101         }
102     }
103 
104     // 打印输出函数
105     void print_array()
106     {
107         for(int i = 0; i < rows; i++)
108         {
109             for(int j = 0; j < rows; j++)
110                 printf("%3d ", array[rows*i+j]);
111             printf("
");
112         }
113     }
114 };
115 
116 int _tmain(int argc, _TCHAR* argv[])
117 {
118     Snake s(7);
119     s.process();
120     s.print_array();
121 
122     system("pause");
123     return 0;
124 }

输出:

  1   2   3   4   5   6   7
 24  25  26  27  28  29   8
 23  40  41  42  43  30   9
 22  39  48  49  44  31  10
 21  38  47  46  45  32  11
 20  37  36  35  34  33  12
 19  18  17  16  15  14  13
请按任意键继续. . .
原文地址:https://www.cnblogs.com/zanzan101/p/3401258.html