Цепочка обязанностей (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));

}

}

}