正确的使用设计模式可以减少条件语句,减少代码量,提高复用性。
错误的使用,则起不到那样的效果。
下面的例子,本想使用策略模式,封装是封装了,可以还是用的状态模式的思路,导致最终没有起到优化的目的。
原因还是选错了模式。
代码:
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("\n"); 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
请按任意键继续. . .