十五、 Mediator的设计

华容道自动求解程序的解题过程可以说是Layout、CircularLinkedList、AVLTree和TreeLinkedList相互协作的过程。为了降低对象间的耦合度,引入了一个中介者Mediator,负责协调它们之间的调用。我们可以在CircularLinkedList对象以及Layout对象中看到各有一个Mediator对象的引用。同时也可以看到Mediator对象持有CircularLinkedList、AVLTree和TreeLinkedList的引用。

Mediator对象首先初始化各个对象,为CircularLinkedList对象创建若干个节点以备使用,同时为TreeLinkedList与AVLTree添加根节点。代码如下:

华容道与数据结构 (11)public void Init(int n)
}

Mediator初始化完成后,我们就可以通过调用Mediator的BeginProcess方法启动搜索过程,Stop方法停止搜索。另外通过Release方法释放所有占用的内存资源。

华容道与数据结构 (11)public void Release()
}

Mediator中的其它方法是为协调个运算对象设计的。我们可以从以下几个方面来看看Mediator是如何协调对象间的工作的:

首先,当某个Layout的CheckAvailableSteps方法被调用,并找到一个可行的布局后,Layout首先检查这个布局是否已经达到解题目的,如果没有,则调用Mediator的CheckStep方法,检查这个布局和以往布局是否有重复,如果没有重复,则将此布局以及走法添加到TreeLinkedList与AVLTree中,并通知CircularLinkedList确认分配的空间。如果布局就是最终解,则调用Layout的Finished方法,追溯棋局走法并输出结果。Layout中的代码如下:

华容道与数据结构 (11)// 将封装好的ChessStep发送给mediator作进一步处理
华容道与数据结构 (11)
if(l.IsFinished)
 _mediator.CheckStep(cs);

这个过程可以用以下两个序列图来描述:

 华容道与数据结构 (11)

 华容道与数据结构 (11)

代码实现如下:

华容道与数据结构 (11)public void CheckStep(ChessStep cStep)
}

Mediator除了实现上述功能外,它还作为CircularLinkedList与TreeLinkedList通讯的一个中间渠道。在前面的文章中曾经提到过,要确保TreeLinkedList中的current指针与CircularLinkedList中的current指针同步移动;同时,Layout在求解的过程中也需要从CircularLinkedList中分配一些可用的Layout来使用。所有这些都是通过Mediator来协调的。

华容道与数据结构 (11)public Layout AllocateLayout()
}

Mediator的引入降低了各对象间的耦合度,增强了系统的灵活性。

在后面的内容中,我将介绍Sample中的代码实现以及性能方面的测试和讨论。

相关文章:

  • 2021-10-22
  • 2021-08-14
  • 2021-11-05
  • 2021-08-09
  • 2021-05-19
猜你喜欢
  • 2021-10-03
  • 2021-12-12
  • 2022-03-09
  • 2021-09-21
  • 2021-08-01
  • 2021-08-24
相关资源
相似解决方案