В чем разница между шаблонами «Цепочка ответственности» и «Стратегия»? - PullRequest
10 голосов
/ 18 февраля 2011

Я поднимаю этот вопрос из-за другого вопроса Я задавал здесь на SO несколько дней назад.
Мне пришлось решить конкретную проблему, и после двух полученных ответов я понял, что две модели могут помочь решить эту проблему (и любую другую подобную).

  1. Цепочка ответственности
  2. Стратегия

Мой вопрос:

В чем именно разница между этими образцами?

Ответы [ 6 ]

24 голосов
/ 18 февраля 2011

Они очень разные.

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

Например, ваш CollectionSorter может поддерживать SortingStrategy (сортировка слиянием, быстрая сортировка, пузырьковая сортировка). Все они имеют одинаковый интерфейс и назначение, но могут выполнять разные задачи.

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

Эта модель является основой вездесущей Инверсии контроля . Изучите это, как только вы закончите с классическими образцами.

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

Популярный пример GOF - система контекстной помощи. Когда вы нажимаете на компонент в настольном приложении, что помогает отображать? Первый элемент в цепочке может искать помощь для того компонента, на который вы нажали. Далее в цепочке можно попытаться вывести справку для всего содержащего диалог. Далее за модуль приложения ... и тд.

Похоже, вы не читали, но должны прочитать классику GOF "Design Patterns".

3 голосов
/ 18 февраля 2011

В Chain of Responsibility каждый объект отвечает за отправку вызова следующему объекту в цепочке, если объект не может его обработать.

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

2 голосов
/ 04 марта 2013

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

Шаблон цепочки отделяет ответственность за отправку запроса от обработки запроса. может быть несколько классов, которые могут обрабатывать один и тот же тип запроса (эти классы обычно реализуют один и тот же интерфейс), но шаблон позволяет передавать запрос от одного класса (в цепочке) к другому до тех пор, пока обработчик не будет большинство подходящих для обработки запроса получает его и отвечает за обработку запроса (или до тех пор, пока нулевой обработчик не получит его и не укажет конец цепочки). Если вы разрешите неправильному обработчику обработать запрос, результат может «НИКОГДА» не быть правильным

Стратегия касается метода обработки или выбора алгоритма. Возьмем пример случая, когда вы хотите рассчитать среднее значение для некоторых выборок. Любой алгоритм может «ВСЕГДА» быть корректным в данном контексте (например, все классы, имеющие стратегию, делают одно и то же: вычисляет среднее значение), но способ вычисления среднего значения или стратегия расчета среднего значения отличаются от одного класса к другому. и шаблон стратегии позволяет вам выбрать, какую стратегию использовать в развязанном виде.

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

способы реализации их в исходном коде могут отличаться от программиста к программисту, но должны PTSUT (пройти тот же модульный тест ")

Изменить:

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

1 голос
/ 25 мая 2017

Наиболее значимым отличием является семантическое поведение реализации.

A Chain of Responsibility может иметь 0...ALL обязанностей, примененных к входу, и каждый Responsibility решает, действует ли он на вход, а затемпередает это.Это процедурная схема, поскольку могут применяться все обязанности.

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

A Strategy имеет одну и только одну из стратегий, применяемых к входу.Это обычно творческий шаблон, так как применяется только одна стратегия.

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

Оба могут быть реализованы как List с использованием Visitor Pattern, разница будет в том, что вы прекратите посещение , когдаStrategy возвращает true.

A Strategy Pattern также может быть реализовано как Map, где Key - это Predicate, который может решить завершить итерацию ключей и затемвы просто получаете Value и это ваш результат.

1 голос
/ 18 февраля 2011

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

Кстати: стратегию GOF можно найти практически в любом паттерне.

0 голосов
/ 10 февраля 2016

Шаблон стратегии:

  1. Это поведенческий шаблон
  2. Он основан на делегировании
  3. Он меняет внутренностиобъекта путем изменения поведения метода
  4. Используется для переключения между семейством алгоритмов
  5. Изменяет поведение объекта во время выполнения.Один алгоритм будет выбран из семейства алгоритмов.

Посмотрите на этот вопрос SE для примера стратегии:

Пример шаблона стратегии в реальном мире

Цепочка ответственности:

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

Ключевые моменты:

  1. Несколько объектов могут обрабатывать запрос, и обработчик может не быть конкретным объектом
  2. В схеме цепочки ответственности запрос будет проходить через цепочку объектов, пока не будет обработан.Но в стратегии один конкретный алгоритм будет выбран во время выполнения из семейства алгоритмов.

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

См. Ниже полезные вопросы / ссылки SE

Chain-of-ответственность_pattern

Шаблон цепи ответственности от oodesign

chain_of_responsibility от создания источника

...