zoukankan      html  css  js  c++  java
  • 一个不恰当使用设计模式的例子

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

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

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

    原因还是选错了模式。

    代码:

      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
    请按任意键继续. . .
  • 相关阅读:
    【centos】centos中添加一个新用户,并授权
    linux基础(10)-导航菜单
    linux基础(9)-获取时间
    linux基础(8)-颜色显示
    linux基础(8)-文件处理(awk 、sed、grep)
    linux基础(7)-IO重定向
    linux基础(6)-shell编程
    linux基础(5)-用户及权限
    linux基础(4)-常用命令
    linux基础(3)-java安装
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3401258.html
Copyright © 2011-2022 走看看