В чем разница между шаблоном проектирования «Цепочка ответственности» и использованием простого блока if-elseif-else?

На днях я просматривал цепочку ответственности и наткнулся на этот пример.

По сути, есть абстрактный обработчик, а затем есть конкретные обработчики, каждый из которых реализует метод дескриптора родительского абстрактного обработчика. Реализация такова, что сначала идет проверка, может ли данный конкретный обработчик обработать текущий запрос, а если нет, то он передает запрос своему преемнику.

Теперь я мог бы сделать то же самое, используя простой условный блок if-else. Чтобы взять первый пример из приведенной выше ссылки, вот как я бы его изменил:

class SingleHandler
{
    if(request > 0 && request <= 10)
    {
        // Process request
    }
    else if(request > 10 && request <= 20)
    {
        // Process request differently
    }
    else if(request > 20 && request <= 30)
    {
        // Process request differently
    }
}

Теперь мой вопрос: в чем принципиальная разница между ними? Есть ли какая-то конкретная причина, по которой я должен вообще использовать цепочку ответственности, если я могу обеспечить точно такую ​​​​же функциональность, используя блоки if-else? Какой из них лучше с точки зрения производительности, потребления памяти, ремонтопригодности, масштабируемости?


person Bhushan Shah    schedule 22.05.2014    source источник


Ответы (1)


Да, вы можете переписать этот пример, чтобы использовать несколько каскадов if-else. Но только потому, что это довольно простой пример.

Цепочка ответственности — это динамический шаблон. Это означает, что обработчики могут быть заменены во время выполнения. Это часто делается в коде пользовательского интерфейса, где несколько вложенных элементов управления могут представлять обработчики. Представьте себе следующий сценарий:

У тебя есть окно. В этом окне есть какая-то панель. На этой панели есть текстовое поле. Вы щелкаете правой кнопкой мыши текстовое поле. Выполняемая команда зависит от иерархии. Система попросит первый обработчик — текстовое поле — обработать запрос клика. Если он не знает, что делать с запросом, он передает его своему родителю — панели — и т. д. Сомневаюсь, что вы захотите реализовать такой сценарий с каскадом if-else. Каждый раз, когда вы меняете пользовательский интерфейс, вам придется менять каскад. Вот почему используются объекты-обработчики. Это делает код заменяемым и повторно используемым.

Многие шаблоны можно реализовать по-разному. Это обычная практика для низкоуровневых языков программирования без объектной ориентации. Однако эти коды обычно довольно негибкие и их трудно поддерживать. Тем не менее, это то, что делает их быстрыми.

person Nico Schertler    schedule 22.05.2014