| public enum AbsoluteDirection { North=0, East, South, West } public enum RelativeDirection { Right, Left, Back } |
| public interface IVehicleControl { void Accelerate(int paramAmount); void Decelerate(int paramAmount); void Turn(RelativeDirection paramDirection); } |
| 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); } |
| public interface IVehicleView { void DisableAcceleration(); void EnableAcceleration(); void DisableDeceleration(); void EnableDeceleration(); void DisableTurning(); void EnableTurning(); } |
| public interface IVehicleControl { void RequestAccelerate(int paramAmount); void RequestDecelerate(int paramAmount); void RequestTurn(RelativeDirection paramDirection); void SetModel(IVehicleModel paramAuto); void SetView(IVehicleView paramView); } |
| 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); void AddObserver(IVehicleView paramView); void RemoveObserver(IVehicleView paramView); void NotifyObservers(); } |
| public class IVehicleView { void DisableAcceleration(); void EnableAcceleration(); void DisableDeceleration(); void EnableDeceleration(); void DisableTurning(); void EnableTurning(); void Update(IVehicleModel paramModel); } |
| public abstract class Automobile: IVehicleModel { "Declarations "#region "Declarations " private ArrayList aList = new ArrayList(); private int mintSpeed = 0; private int mintMaxSpeed = 0; private int mintMaxTurnSpeed = 0; private int mintMaxReverseSpeed = 0; private AbsoluteDirection mDirection = AbsoluteDirection.North; private string mstrName = ""; #endregion "Constructor"#region "Constructor" public Automobile(int paramMaxSpeed, int paramMaxTurnSpeed, int paramMaxReverseSpeed, string paramName) { this.mintMaxSpeed = paramMaxSpeed; this.mintMaxTurnSpeed = paramMaxTurnSpeed; this.mintMaxReverseSpeed = paramMaxReverseSpeed; this.mstrName = paramName; } #endregion "IVehicleModel Members"#region "IVehicleModel Members" public void AddObserver(IVehicleView paramView) { aList.Add(paramView); } public void RemoveObserver(IVehicleView paramView) { aList.Remove(paramView); } public void NotifyObservers() { foreach(IVehicleView view in aList) { view.Update(this); } } public string Name { get { return this.mstrName; } set { this.mstrName = value; } } public int Speed { get { return this.mintSpeed; } } public int MaxSpeed { get { return this.mintMaxSpeed; } } public int MaxTurnSpeed { get { return this.mintMaxTurnSpeed; } } public int MaxReverseSpeed { get { return this.mintMaxReverseSpeed; } } public AbsoluteDirection Direction { get { return this.mDirection; } } public void Turn(RelativeDirection paramDirection) { AbsoluteDirection newDirection; switch(paramDirection) { case RelativeDirection.Right: newDirection = (AbsoluteDirection)((int)(this.mDirection + 1) %4); break; case RelativeDirection.Left: newDirection = (AbsoluteDirection)((int)(this.mDirection + 3) %4); break; case RelativeDirection.Back: newDirection = (AbsoluteDirection)((int)(this.mDirection + 2) %4); break; default: newDirection = AbsoluteDirection.North; break; } this.mDirection = newDirection; this.NotifyObservers(); } public void Accelerate(int paramAmount) { this.mintSpeed += paramAmount; if(mintSpeed >= this.mintMaxSpeed) mintSpeed = mintMaxSpeed; this.NotifyObservers(); } public void Decelerate(int paramAmount) { this.mintSpeed -= paramAmount; if(mintSpeed <= this.mintMaxReverseSpeed) mintSpeed = mintMaxReverseSpeed; this.NotifyObservers(); } #endregion } |
| public class AutomobileControl: IVehicleControl { private IVehicleModel Model; private IVehicleView View; public AutomobileControl(IVehicleModel paramModel, IVehicleView paramView) { this.Model = paramModel; this.View = paramView; } public AutomobileControl() {} IVehicleControl Members#region IVehicleControl Members public void SetModel(IVehicleModel paramModel) { this.Model = paramModel; } public void SetView(IVehicleView paramView) { this.View = paramView; } public void RequestAccelerate(int paramAmount) { if(Model != null) { Model.Accelerate(paramAmount); if(View != null) SetView(); } } public void RequestDecelerate(int paramAmount) { if(Model != null) { Model.Decelerate(paramAmount); if(View != null) SetView(); } } public void RequestTurn(RelativeDirection paramDirection) { if(Model != null) { Model.Turn(paramDirection); if(View != null) SetView(); } } #endregion public void SetView() { if(Model.Speed >= Model.MaxSpeed) { View.DisableAcceleration(); View.EnableDeceleration(); } else if(Model.Speed <= Model.MaxReverseSpeed) { View.DisableDeceleration(); View.EnableAcceleration(); } else { View.EnableAcceleration(); View.EnableDeceleration(); } if(Model.Speed >= Model.MaxTurnSpeed) { View.DisableTurning(); } else { View.EnableTurning(); } } } |
| public class ACME2000SportsCar:Automobile { public ACME2000SportsCar(string paramName):base(250, 40, -20, paramName){} public ACME2000SportsCar(string paramName, int paramMaxSpeed, int paramMaxTurnSpeed, int paramMaxReverseSpeed): base(paramMaxSpeed, paramMaxTurnSpeed, paramMaxReverseSpeed, paramName){} } |
| public class AutoView : System.Windows.Forms.UserControl, IVehicleView { private IVehicleControl Control = new ACME.AutomobileControl(); private IVehicleModel Model = new ACME.ACME2000SportsCar("Speedy"); } |
| public AutoView() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); WireUp(Control, Model); } public void WireUp(IVehicleControl paramControl, IVehicleModel paramModel) { // If we're switching Models, don't keep watching // the old one! if(Model != null) { Model.RemoveObserver(this); } Model = paramModel; Control = paramControl; Control.SetModel(Model); Control.SetView(this); Model.AddObserver(this); } |
| private void btnAccelerate_Click(object sender, System.EventArgs e) { Control.RequestAccelerate(int.Parse(this.txtAmount.Text)); } private void btnDecelerate_Click(object sender, System.EventArgs e) { Control.RequestDecelerate(int.Parse(this.txtAmount.Text)); } private void btnLeft_Click(object sender, System.EventArgs e) { Control.RequestTurn(RelativeDirection.Left); } private void btnRight_Click(object sender, System.EventArgs e) { Control.RequestTurn(RelativeDirection.Right); } |
| public void UpdateInterface(IVehicleModel auto) { this.label1.Text = auto.Name + " heading " + auto.Direction.ToString() + " at speed: " + auto.Speed.ToString(); this.pBar.Value = (auto.Speed>0)? auto.Speed*100/auto.MaxSpeed : auto.Speed*100/auto.MaxReverseSpeed; } |
| public void DisableAcceleration() { this.btnAccelerate.Enabled = false; } public void EnableAcceleration() { this.btnAccelerate.Enabled = true; } public void DisableDeceleration() { this.btnDecelerate.Enabled = false; } public void EnableDeceleration() { this.btnDecelerate.Enabled = true; } public void DisableTurning() { this.btnRight.Enabled = this.btnLeft.Enabled = false; } public void EnableTurning() { this.btnRight.Enabled = this.btnLeft.Enabled = true; } public void Update(IVehicleModel paramModel) { this.UpdateInterface(paramModel); } |
| public class ACME2000Truck: Automobile { public ACME2000Truck(string paramName):base(80, 25, -12, paramName){} public ACME2000Truck(string paramName, int paramMaxSpeed, int paramMaxTurnSpeed, int paramMaxReverseSpeed): base(paramMaxSpeed, paramMaxTurnSpeed, paramMaxReverseSpeed, paramName){} } |
| private void btnBuildNew_Click(object sender, System.EventArgs e) { this.autoView1.WireUp(new ACME.AutomobileControl(), new ACME.ACME2000Truck(this.txtName.Text)); } |
| public void RequestAccelerate(int paramAmount) { if(Model != null) { int amount = paramAmount; if(amount > 5) amount = 5; Model.Accelerate(amount); if(View != null) SetView(); } } public void RequestDecelerate(int paramAmount) { if(Model != null) { int amount = paramAmount; if(amount > 5) amount = 5; Model.Accelerate(amount); Model.Decelerate(amount); if(View != null) SetView(); } } |
| private void btnBuildNew_Click(object sender, System.EventArgs e) { this.autoView1.WireUp(new ACME.SlowPokeControl(), new ACME.ACME2000Truck(this.txtName.Text)); } |