IVehicleControl 介面新增 SetModel/SetView
public interface IVehicleControl
{
void RequestAccelerate(int amount);
void RequestDecelerate(int amount);
void RequestTurn(RelativeDirection dir);
void SetModel(IVehicleModel model);
void SetView(IVehicleView view);
}
AutomobileControl 實作:觀察者模式通知 View 更新
public class AutomobileControl : IVehicleControl
{
private IVehicleModel _model;
private IVehicleView _view;
public AutomobileControl() {}
public AutomobileControl(IVehicleModel m, IVehicleView v) { _model=m; _view=v; }
public void SetModel(IVehicleModel m) => _model = m;
public void SetView(IVehicleView v) => _view = v;
public void RequestAccelerate(int amount)
{
if (_model != null) { _model.Accelerate(amount); UpdateView(); }
}
public void RequestDecelerate(int amount)
{
if (_model != null) { _model.Decelerate(amount); UpdateView(); }
}
public void RequestTurn(RelativeDirection dir)
{
if (_model != null) { _model.Turn(dir); UpdateView(); }
}
private void UpdateView()
{
if (_view == null) return;
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();
}
}
設計重點
- **介面導向程式設計**:Control 僅持有
IVehicleModel/IVehicleView 介面參考,不依賴具體類別
- **觀察者模式簡化版**:Model 變更後 Control 主動呼叫
UpdateView() 推送狀態至 View,而非 View 輪詢
- **狀態同步邏輯集中**:加速/減速/轉向三個請求方法皆呼叫同一
UpdateView(),確保 UI 與 Model 一致