State
Problemet
Ett objekts beteende beror på dess tillstånd (ett trafikljus beter sig olika i rött, gult, grönt) — utan mönstret blir koden en enda stor switch på ett tillstånds-fält, upprepad i varje metod som bryr sig om tillståndet.
Lösningen
public interface ITrafikljusState{ void Byt(Trafikljus ljus); string Färg { get; }}
public class RödState : ITrafikljusState{ public string Färg => "Röd"; public void Byt(Trafikljus ljus) => ljus.SättState(new GrönState());}
public class GrönState : ITrafikljusState{ public string Färg => "Grön"; public void Byt(Trafikljus ljus) => ljus.SättState(new GulState());}
public class GulState : ITrafikljusState{ public string Färg => "Gul"; public void Byt(Trafikljus ljus) => ljus.SättState(new RödState());}
// Context — delegerar till sitt aktuella tillstånd, vet inget om övergångslogiken självpublic class Trafikljus{ private ITrafikljusState _state = new RödState();
public void SättState(ITrafikljusState state) => _state = state; public void NästaLjus() => _state.Byt(this); public string AktuellFärg => _state.Färg;}var ljus = new Trafikljus();Console.WriteLine(ljus.AktuellFärg); // Röd
ljus.NästaLjus();Console.WriteLine(ljus.AktuellFärg); // GrönVarje tillstånd vet själv vilket tillstånd som kommer härnäst — Trafikljus behöver aldrig en switch som räknar upp alla övergångar.
TL;DR
State flyttar tillståndsberoende beteende till egna klasser — en per tillstånd — istället för en stor switch upprepad överallt objektet används. Övergångarna blir en del av varje tillstånds egen kod.