В чем разница между шаблонами C++ Composite и Chain of Responsibility?

В чем разница между шаблонами C++ Composite и Chain of Responsibility?
В чем разница между шаблонами C++ Composite и Chain of Responsibility? - ranurte @ Unsplash

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

Шаблоны Composite и Chain of Responsibility очень похожи, и я предполагаю, что реализации будут иметь тенденцию содержать понемногу и то, и другое. Сказав это, я вижу тонкие различия между ними.

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

  2. Описание шаблона Composite на странице, на которую вы ссылаетесь https://refactoring.guru/design-patterns/composite, на самом деле содержит хорошую иллюстрацию этого шаблона и того, где он может быть другим. Смотрите иллюстрацию со страницы ниже:

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

  3. Если бы это была реализация цепочки ответственности, то первого потомка попросили указать свою цену, и ему была бы предоставлена ​​ссылка на следующего потомка. И тогда ответственность за передачу просьбы лежит на отдельных детях. Но тогда отдельные дети также могли бы сократить процесс, и, таким образом, вы не получили бы полную цену.

Итак, в конце:

Цепочка ответственности: обработчик передает запрос следующему обработчику в списке, а также имеет полный контроль над тем, следует ли вызывать следующий обработчик.

Составной: Контроллер, вызывающий обработчик, вызывает отдельные обработчики, и, таким образом, обработчики будут управлять своим собственным обработчиком и будут ли вызывать свои дочерние обработчики (если они есть), но не следующий обработчик контроллера.

Рекомендую посмотреть эти видео для лучшего погружения в вопрос:

Прикрепленное видео 1 - Proxy (Заместитель, Прокси) ► Шаблон проектирования Урок №22

Прикрепленное видео 2 - Blueprints vs. C++: How They Fit Together and Why You Should Use Both


LetsCodeIt, 25 апреля 2023 г., 09:05