Chain of Responsibility
Problemet
Flera objekt kan hantera en begäran, men avsändaren vet inte i förväg vilket. En lång if/else if-kedja fungerar, men blir stel — att lägga till en ny hanterare betyder att ändra kedjan på ett ställe.
Lösningen
public interface IHandler{ IHandler SetNext(IHandler handler); void Handle(int nivå);}
public abstract class BaseHandler : IHandler{ private IHandler? _next;
public IHandler SetNext(IHandler handler) { _next = handler; return handler; // Möjliggör kedjning: a.SetNext(b).SetNext(c) }
public virtual void Handle(int nivå) => _next?.Handle(nivå);}
public class SupportHandler : BaseHandler{ public override void Handle(int nivå) { if (nivå <= 1) Console.WriteLine("Support löser ärendet"); else base.Handle(nivå); // Kan inte hantera — skicka vidare }}
public class ManagerHandler : BaseHandler{ public override void Handle(int nivå) { if (nivå <= 3) Console.WriteLine("Chef löser ärendet"); else base.Handle(nivå); }}var support = new SupportHandler();var chef = new ManagerHandler();support.SetNext(chef);
support.Handle(1); // Support löser ärendetsupport.Handle(3); // Chef löser ärendetVarje hanterare avgör själv: hantera det, eller skicka vidare till nästa länk i kedjan. Avsändaren skickar bara till den första länken och bryr sig inte om vem som faktiskt hanterar begäran.
Släktskap med LinkedList
Strukturen — varje länk känner bara till nästa — påminner om en länkad lista. Skillnaden är att varje länk här också innehåller logik för om den ska hantera begäran eller skicka den vidare.
TL;DR
Chain of Responsibility skickar en begäran genom en kedja av hanterare där var och en avgör själv om den hanterar den eller skickar den vidare — nya hanterare läggs till utan att ändra befintliga.