I tried to implement a traffic light system using state pattern, please comment on the OOP/design pattern use.
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace DesignPatternsQuestions
{
/// <summary>
/// implement a traffic light system
/// </summary>
[TestClass]
public class StatePatternTest
{
[TestMethod]
public void StateTrafficLightTest()
{
TrafficLight light = new TrafficLight(new RedState());
light.ChangeLight();
Assert.IsInstanceOfType(light.State,typeof(GreenState));
light.ChangeLight();
Assert.IsInstanceOfType(light.State, typeof(YellowState));
light.ChangeLight();
Assert.IsInstanceOfType(light.State, typeof(RedState));
light.ChangeLight();
Assert.IsInstanceOfType(light.State, typeof(GreenState));
}
}
public class TrafficLight
{
private State _state;
public TrafficLight(State state)
{
_state = state;
}
// Gets or sets the state
public State State
{
get { return _state; }
set
{
_state = value;
Console.WriteLine("State: " +
_state.GetType().Name);
}
}
//this is the trickS
public void ChangeLight()
{
_state.SetState(this);
}
}
public abstract class State
{
public abstract void SetState(TrafficLight light);
}
public class RedState: State
{
public override void SetState(TrafficLight light)
{
light.State = new GreenState();
}
}
public class YellowState : State
{
public override void SetState(TrafficLight light)
{
light.State = new RedState();
}
}
public class GreenState : State
{
public override void SetState(TrafficLight light)
{
light.State = new YellowState();
}
}
}
State
class is overkill here when simpleenum
or even declared int constants could be used. I would also consider 2 other states: None (with a value of 0) for when all lights are off or malfunctioning, and BlinkingRed. Where I live there is also blinking yellow left turn arrows to consider. \$\endgroup\$