设计模式之State(2)遍历矩形

一 问题描述

       有一个N*N的矩形,现在从四个顶角的一个位置出发,按照下图的方式走完该矩形,输出经过的坐标。


二 分析

       如何在实际应用中运用State模式呢?

       从上面的图中我们可以得到这样的描述:从左上角开始,向东走,到第一行结束的时候,改变方向向南,走到下一行,然后向西走,到第二行开始的时候,改变方向向南,在走到第三行,改变方向朝东…。考虑到另外三个开始的方位,我们可以得到:

状态:朝东,朝西,朝南,朝北

事件:左转,右转,前行

(注意:如果要用设计模式来解决问题,千万不要从编码实现的角度来考虑如何解决这个问题,尝试着从比较抽象的角度来考虑如何解决这个问题。)

状态图

  • 根据状态图不使用State模式的可能的代码:

//假设xmax×ymax的矩形,那么矩阵的遍历可以这样实现

while (y<=yMax||x<=xMax)

{   forward();  }

public void forward(){

   switch(dirState){

      case E: if (x <xmax) x++;

                   else dirState.right(); break;

      case S: if (x==xmax) 

                     dirState.right();

                  else dirState.left(); break;

      case W: if (x>xmin) x--;

                    else dirState.left(); break;

      case N: dirState.right();

   }

}

  • 使用STATE模式

类图:

说明:Context为状态机,持有一个状态对象(SAState),提供改变状态的事件run() right() left()。在本例种,Context状态机初始状态为East状态,用run()来触发状态发生改变,状态具体如何改变,由实现SAState接口的各个子状态实现。如:状态机的初始态为East,East的run()动作在到达第一行尾后,执行right(),使状态机的状态由East改尾South。

 

你可能感兴趣的:(设计模式之State(2)遍历矩形)