下一個部分比較巧妙。我們希望VIEw知道Model中的變化。為了達到這個目的,我們使用觀察者模式。
開始
作為總是想的遠一點的開發人員,我們想讓我們的系統有一個長久並且良好的生命周期。這就是說能夠進可能的准備好滿足ACME的很多變化。為了做到這一點,我們知道要遵循兩條原則...“保證你的類低耦合”,要達到這個目標,還要“對接口編程”。
所以我們要做三個接口(正如你所猜測,一個Model接口,一個VIEw接口,一個Control接口)。
經過很多調查研究,和與ACME人的費力咨詢,我們得到了很多有關詳細設計的信息。我們想確定我們可以設置的最大速度在前進,後退和轉彎中。我們也需要能夠加速,減速,左轉和右轉。我們的儀表盤必須顯示當前的速度和方向。
實現所有這些需求是非常苛刻的,但是我們確信我們能夠做到...
首先,我們考慮一下基本的項目。我們需要一些東西來表示方向和轉動請求。我們做了兩個枚舉類型:
AbsoluteDirection 和 RelativeDirection。
public enum AbsoluteDirection
{
North=0, East, South, West
}
public enum RelativeDirection
{
Right, Left, Back
}
下面來解決Control接口。我們知道Control需要將請求傳遞給Model,這些請求包括:Accelerate, Decelerate,和 Turn。我們建立一個IVehicleControl接口,並加入適當的方法。
public interface IVehicleControl
{
void Accelerate(int paramAmount);
void Decelerate(int paramAmount);
void Turn(RelativeDirection paramDirection);
}
現在我們來整理Model接口。我們需要知道汽車的名字,速度,最大速度,最大倒退速度,最大轉彎速度和方向。
我們也需要加速,減速,轉彎的函數。
public interface IVehicleModel
{
string Name{ get; set;}
int Speed{ get; set;}
int MaxSpeed{ get;}
int MaxTurnSpeed{ get;}
int MaxReverseSpeed { get;}
AbsoluteDirection Direction{get; set;}
void Turn(RelativeDirection paramDirection);
void Accelerate(int paramAmount);
void Decelerate(int paramAmount);
}
最後,我們來整理View接口。我們知道VIEw需要暴露出Control的一些機能,比如允許或禁止加速,減速和轉彎申請。
public interface IVehicleVIEw
{
void DisableAcceleration();
void EnableAcceleration();
void DisableDeceleration();
void EnableDeceleration();
void DisableTurning();
void EnableTurning();
}