Инструменты пользователя

Инструменты сайта


pattern_chain_of_responsibility

Назад

В паттерне Цепочка Обязанностей создается цепочка объектов, последовательно анализирующих запрос. Каждый объект получает запрос и либо обрабатывает его, либо передает следующему объекту в цепочки.

Преимущества

  • Логическая изоляция отправителя запроса от получателя.
  • Объект упрощается поскольку ему не нужно ни знать структуру цепочки ни хранить ссылки на её элементы.
  • Возможность динамического добавления или удаления обязанностей посредством изменения элементов цепочки или их порядка.

Недостатки

  • Цепочки могут усложнять отслеживание запросов и отладку.
  • Обработка запросов мб не выполнена если для него не будет обработчика это как и недостаток так и преимущества.

Handler
public class Handler
{
    private Handler successor;
 
    //Принимаем ссылку на следующий объект (Приемник)
    public void setSuccessor(Handler successor)
    {
        this.successor = successor;
    }
 
    public Handler getSuccessor()
    {
        return successor;
    }
 
    public void handleRequest(int i)
    {
        successor.handleRequest(i);
    }
}
 
class ConcreteHandler1 extends Handler
{
 
    public void handleRequest(int i)
    {
        if (i == 1)
        {
            System.out.println("Результат выполнение Handler1");
        } 
        else
        {
            System.out.print("Был задействован обработчик Handler1 ");
            getSuccessor().handleRequest(i);
        }
    }
}
class ConcreteHandler2 extends Handler
{
 
    public void handleRequest(int i)
    {
        if (i == 2)
        {
            System.out.println("Результат выполнение Handler2");
        } else
        {
            System.out.print("Был задействован обработчик Handler2 ");
            getSuccessor().handleRequest(i);
        }
    }
}
class ConcreteHandler3 extends Handler
{
 
    public void handleRequest(int i)
    {
        if (i == 3)
        {
            System.out.println("Результат выполнение Handler3");
        } else
        {
            System.out.print("Был задействован обработчик Handler3 ");
            getSuccessor().handleRequest(i);
        }
    }
}
class ConcreteHandler4 extends Handler
{
 
    public void handleRequest(int i)
    {
        if (i == 4)
        {
            System.out.println("Результат выполнение Handler4");
        } else
        {
            System.out.print("Был задействован обработчик Handler4 ");
            getSuccessor().handleRequest(i);
        }
    }
}
public class Main
{
 
    public static void main(String arg[])
    {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
        Handler handler4 = new ConcreteHandler4();
 
 
        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);
        handler3.setSuccessor(handler4);
 
        handler1.handleRequest(1);
        handler1.handleRequest(2);
        handler1.handleRequest(3);
        handler1.handleRequest(4);
    }
}
результат
Результат выполнение Handler1
Был задействован обработчик Handler1 Результат выполнение Handler2
Был задействован обработчик Handler1 Был задействован обработчик Handler2 Результат выполнение Handler3
Был задействован обработчик Handler1 Был задействован обработчик Handler2 Был задействован обработчик Handler3 Результат выполнение Handler4