Цепочка обязанностей (Chain of responsibility)
Шаблон Цепочка обязанностей работает со списком объектов, называемых обработчиками. Каждый из обработчиков имеет естественные ограничения на множество запросов, которые он в состоянии поддержать. Если текущий обработчик не может поддержать запрос, он передаёт его следующему обработчику в списке. Так продолжается, пока запрос не будет обработан, или пока список не закончится.
Дизайн шаблона Цепочка обязанностей достаточно прост (рис. 18). Каждый из обработчиков принадлежит к одному из классов, имеющих общего предка. Кроме метода (или методов) для обработки запроса, каждый обработчик имеет поле, указывающее на следующий обработчик в цепочке.
Рис. 18. Диаграмма шаблона Цепочка обязанностей.
Ниже приведён код, иллюстрирующий применение шаблона Цепочка обязанностей.
public class Handler
{
public int Limit { get; private set; }
public Handler Next { get; private set; }
public Handler(int limit, Handler handler)
{
Limit = limit;
Next = handler;
}
public string HandleRequest(int data)
{
if (data < Limit)
{
return string.Format("Request for {0} handled", data);
}
if (Next != null)
{
return Next.HandleRequest(data);
}
return "Request handled BY DEFAULT";
}
}
public class ChainOfResponsibilityExample
{
public static void Main()
{
Handler start = null;
for (var i = 5; i > 0; i--)
{
start = new Handler(i*1000, start);
}
int[] data = {50, 2000, 1500, 10000, 175, 4500};
foreach (var i in data)
{
System.Console.WriteLine(start.HandleRequest(i));
}
}
}