[附加题] 改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享。算法
目前的设计有什么缺点, 你会如何改进它? 设计模式
1.以前判断电梯是否闲置的函数不太好理解,从新修改了,以下所示:函数
//是否停顿状态(中止的以及开门间隔>=0) public bool IsIdle { get { return CurrentStatus.CurrentDirection == Direction.No && CurrentStatus.DoorCloseOpenTicks < 0; } }
2.原来的程序将每个电梯的target都初始化为0,感受并不合理。由于最开始电梯的状态应该是没有目标楼层的,并且在咱们的算法中target若是一开始为0,会致使重复开门的问题。因此咱们把target初始化为-1,表明电梯那时候并无目标楼层。工具
3.IElevator接口中定义的函数public bool ReqStopAt(int targetFloor) ,先看函数名很容易让人联想到这个函数的做用是是调度电梯前往目标楼层,再看它的返回值是布尔类型,也就天然想到返回值标志着是否成功到达目标楼层。但是看具体的函数时,发现这个函数其实主要做用是将targetFloor这个参数的值赋给电梯的target,修改当前方向,并未把target如何具体发生改变的过程展示出来,并且返回值标志的是是否接受调度请求。因此感受这个函数的问题要么是名字起得很差,要么是实现过程和名称不符。测试
其实这个函数的主要做用就是更新电梯状态(包括当前运行方向以及当前的目标楼层),因此咱们以为这部分代码彻底能够放到StatusUpdateForEveryTick(int ticks)这个函数里,感受这样更方便使用。spa
[附加题] 目前的这个测试程序只有命令行界面, 请给它设计UI界面, 显示乘客/电梯的运动, 并实现之。命令行
运行时的窗体用录屏工具作成了视频,而后转成了gif,就是有点小(免费软件理解一下)……线程
主要的界面设计参照了上一级某Pair的设计,可是鉴于时间关系咱们只展现了电梯的运行,没有展现出乘客的状态。设计
不过作到这一点已经比较纠结了,由于窗体是在主线程建立的,而TickGoes中若是想对窗体的控件进行修改的话是不容许的。参考的Pair用的方法咱们试着没有成功……最后用了委托这个东西,可是比较遗憾的是不能不能直接重复开始,要关掉重来才能够。调试
限于时间关系关系暂时只能这样了。这一版没有上传TFS,这个没有关系吧?
须要的话能够在博客贴出代码。
[附加题] 阅读有关 MVC 和 MVVM 设计模式的文章。
3.1 MVC(Model View Controller)
即模型(model)-视图(view)-控制器(controller)。
MVC原本是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC是将M和V的实现代码分离,从而使同一个程序可使用不一样的表现形式。好比一批统计数据你能够分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,从例子能够看出MVC就是Observer设计模式的一个特例。