using System.Collections.Generic;
public abstract class OnBoardComputer
public string Name { get; protected set; }
public bool IsLandingGearRaised { get; set; }
public bool IsInManualMode { get; set; }
public event LandingGearHandler OnLandingGearRaisedEvent;
public delegate void LandingGearHandler(OnBoardComputer computer);
public void OnLandingGearRaised()
if (OnLandingGearRaisedEvent != null) OnLandingGearRaisedEvent(this);
public event ManualModeHandler OnManualModeEvent;
public delegate void ManualModeHandler(OnBoardComputer computer);
public void OnManualMode()
if (OnManualModeEvent != null) OnManualModeEvent(this);
public Stack<ICommand> Journal = new Stack<ICommand>();
public bool ExecuteCommand(ICommand command)
if (command.Execute(this))
public interface ICommand
bool Execute(OnBoardComputer computer);
public class RaiseLandingGear : ICommand
public bool Execute(OnBoardComputer computer)
if (!computer.IsLandingGearRaised)
if (computer is Boeing) { }
if (computer is Cesna) { }
computer.OnLandingGearRaised();
public class LowLandingGear : ICommand
public bool Execute(OnBoardComputer computer)
if (computer.IsLandingGearRaised)
if (computer is Boeing) { }
if (computer is Cesna) { }
public class SwitchToManual : ICommand
public bool Execute(OnBoardComputer computer)
if (!computer.IsInManualMode)
if (computer is Boeing) { }
if (computer is Cesna) { }
public class SwitchToAutopilot : ICommand
public bool Execute(OnBoardComputer computer)
if (computer.IsInManualMode)
if (computer is Boeing) { }
if (computer is Cesna) { }
public class Boeing : OnBoardComputer
public class Cesna : OnBoardComputer
public static void Main()
var boeing = new Boeing();
boeing.OnManualModeEvent += computer => Console.WriteLine(computer.Name + " is on manual");
cesna.OnLandingGearRaisedEvent += computer => Console.WriteLine(computer.Name + " raised landing gear");
boeing.ExecuteCommand(new SwitchToManual());
cesna.ExecuteCommand(new RaiseLandingGear());