Почему я когда-либо использовал бы Цепочку Ответственности по Декоратору?

Вы можете зациклить индекс, который распечатает их все

for i in range(300):
    print(response_dict['entries'][i]['summonerName'])

Когда вы используете response_dict['entries'][M:N]

Вы создаете новый список словарей, которые должны быть извлечены прежде чем вы можете ссылаться на ['summonerName'] непосредственно

Если вы print(response_dict['entries'][0:3])

Вы поймете, что я имею в виду

70
задан Ravindra babu 7 April 2016 в 16:31
поделиться

6 ответов

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

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

Когда я работал с Win32 API, мне иногда приходилось использовать предоставляемые им функции перехвата. Перехват сообщения Windows примерно соответствует схеме цепочки ответственности. Когда вы перехватили сообщение типа WM_MOUSEMOVE, будет вызвана функция обратного вызова. Думайте о функции обратного вызова как о последней ссылке в цепочке. Каждая ссылка в цепочке может решить, выбрасывать ли сообщение WM_MOUSEMOVE или передавать его по цепочке к следующей ссылке.

Если бы в этом примере использовался шаблон Decorator, вы были бы уведомлены о сообщении WM_MOUSEMOVE, но вы были бы бессильны помешать другим хукам справиться с ним.

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

Каждая ссылка в цепочке может решить, выбрасывать ли сообщение WM_MOUSEMOVE или передавать его по цепочке к следующей ссылке.

Если бы в этом примере использовался шаблон Decorator, вы были бы уведомлены о сообщении WM_MOUSEMOVE, но вы были бы бессильны помешать другим хукам справиться с ним.

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

Каждая ссылка в цепочке может решить, выбрасывать ли сообщение WM_MOUSEMOVE или передавать его по цепочке к следующей ссылке.

Если бы в этом примере использовался шаблон Decorator, вы были бы уведомлены о сообщении WM_MOUSEMOVE, но вы были бы бессильны помешать другим хукам справиться с ним.

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

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

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

68
ответ дан William Brendel 24 November 2019 в 13:26
поделиться

Цепочка

Избегайте связывания отправителя запроса его получателю, давая больше, чем один объект шанс справиться с запрос. Цепочка получения объектов и передать запрос по цепочке пока объект не обработает его.

против

Декоратор

Приложить дополнительные обязанности к объект динамически. Декораторы обеспечить гибкую альтернативу подкласс для расширения Функциональность.

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

13
ответ дан Brian 24 November 2019 в 13:26
поделиться

Я бы сказал, что Цепочка ответственности является особой формой Декоратора .

11
ответ дан troelskn 24 November 2019 в 13:26
поделиться

Decorator is used when you want to add functionality to an object.

COR is used when one of many actors might take action on an object.

A particular Decorator is called to take an action, based on the type; while COR passes the object along a defined chain until one of the actors decides the action is complete.

COR might be used when there are multiple levels of escalation to different handlers -- for instance, a call center where the customer's value to the company determines if the call goes to a particular level of support.

8
ответ дан Ragoczy 24 November 2019 в 13:26
поделиться

Ну, я могу вспомнить две ситуации:

  • У вас нет основного объекта, т.е. вы не Не знаю, что делать с запросом после того, как он прошел все слои / фильтры. (что-то вроде такого аспекта, как цепочки перехватчиков, которым на самом деле все равно, где заканчивается запрос).
  • Вам необходимо выборочно применять некоторую предварительную или постобработку к запросу. Не в общей форме улучшения, как декоратор. то есть фильтры могут обрабатывать или не обрабатывать конкретный запрос, но добавление декоратора всегда расширяет ваш объект с некоторой функциональностью.

Не могу больше думать об этом сейчас, хотелось бы услышать больше в этой теме.

4
ответ дан MahdeTo 24 November 2019 в 13:26
поделиться

Разница между этими шаблонами не связана с тем, когда и как цепочка может быть разорвана (что предполагает наличие цепочки) или когда выполняется дополнительное поведение. Они связаны тем, что оба используют композицию в пользу наследования, чтобы обеспечить более гибкое решение.

Ключевое различие состоит в том, что декоратор добавляет новое поведение, которое фактически расширяет исходный интерфейс. Это похоже на то, как обычное расширение может добавлять методы, за исключением того, что «подкласс» связан только ссылкой, что означает, что можно использовать любой «суперкласс».

Шаблон COR может изменять существующее поведение, подобное переопределению существующего метод с использованием наследования. Вы можете вызвать super.xxx (), чтобы продолжить «цепочку», или обработать сообщение самостоятельно.

Так что разница невелика, но пример декоратора должен помочь:

interface Animal
{
    Poo eat(Food food);
}

class WalkingAnimal implements Animal
{
    Animal wrapped;
    WalkingAnimal(Animal wrapped)
    {
        this.wrapped = wrapped;
    }

    Position walk(Human walker)
    {
    };

    Poo eat(Food food)
    {
      return wrapped.eat(food);
    }
}

class BarkingAnimal implements Animal
{
    Animal wrapped;
    BarkingAnimal(Animal wrapped)
    {
        this.wrapped = wrapped;
    }

    Noise bark()
    {
    };

    Poo eat(Food food)
    {
        bark();
        return wrapped.eat();
    }
}

Вы видите, что мы можем создать идущее, лающее животное ... или фактически добавить способность лаять любому животному. Чтобы использовать это дополнительное поведение напрямую, нам нужно сохранить ссылку на декоратор BarkingAnimal.

Все BarkingAnimal также лают один раз перед едой, что изменило существующую функциональность и поэтому похоже на COR. Но цель не такая, как у COR, т.е. найти одно животное из многих, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

interface Animal
{
    Poo eat(Food food);
}

class WalkingAnimal implements Animal
{
    Animal wrapped;
    WalkingAnimal(Animal wrapped)
    {
        this.wrapped = wrapped;
    }

    Position walk(Human walker)
    {
    };

    Poo eat(Food food)
    {
      return wrapped.eat(food);
    }
}

class BarkingAnimal implements Animal
{
    Animal wrapped;
    BarkingAnimal(Animal wrapped)
    {
        this.wrapped = wrapped;
    }

    Noise bark()
    {
    };

    Poo eat(Food food)
    {
        bark();
        return wrapped.eat();
    }
}

Вы видите, что мы можем изобразить идущее, лающее животное ... или фактически добавить способность лаять любому животному. Чтобы использовать это дополнительное поведение напрямую, нам нужно сохранить ссылку на декоратор BarkingAnimal.

Все BarkingAnimal также лают один раз перед едой, что изменило существующую функциональность и поэтому похоже на COR. Но цель не такая, как у COR, т.е. найти одно животное из многих, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

interface Animal
{
    Poo eat(Food food);
}

class WalkingAnimal implements Animal
{
    Animal wrapped;
    WalkingAnimal(Animal wrapped)
    {
        this.wrapped = wrapped;
    }

    Position walk(Human walker)
    {
    };

    Poo eat(Food food)
    {
      return wrapped.eat(food);
    }
}

class BarkingAnimal implements Animal
{
    Animal wrapped;
    BarkingAnimal(Animal wrapped)
    {
        this.wrapped = wrapped;
    }

    Noise bark()
    {
    };

    Poo eat(Food food)
    {
        bark();
        return wrapped.eat();
    }
}

Как видите, мы можем изобразить идущее, лающее животное ... или, фактически, добавить способность лаять любому животному. Чтобы использовать это дополнительное поведение напрямую, нам нужно сохранить ссылку на декоратор BarkingAnimal.

Все BarkingAnimal также лают один раз перед едой, что изменило существующую функциональность и поэтому похоже на COR. Но цель не такая, как у COR, т.е. найти одно из многих животных, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

Чтобы использовать это дополнительное поведение напрямую, нам нужно сохранить ссылку на декоратор BarkingAnimal.

Все BarkingAnimal также лают один раз перед едой, что изменило существующую функциональность и поэтому похоже на COR. Но цель не такая, как у COR, т.е. найти одно животное из многих, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

Чтобы использовать это дополнительное поведение напрямую, нам нужно сохранить ссылку на декоратор BarkingAnimal.

Все BarkingAnimal также лают один раз перед едой, что изменило существующую функциональность и поэтому похоже на COR. Но цель не такая, как у COR, т.е. найти одно животное из многих, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

Но цель не такая, как у COR, т.е. найти одно из многих животных, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

Но цель не такая, как у COR, т.е. найти одно животное из многих, которое будет есть эту пищу. Цель здесь - изменить поведение.

Вы можете представить, что COR применяется для поиска человека, который выводит животное на прогулку. Это может быть реализовано как связанный список, например связанный выше, или как явный список ... или что-то в этом роде.

Надеюсь, это достаточно ясно!

Джон

17
ответ дан 24 November 2019 в 13:26
поделиться