Является ли HashMap в цепи ответственности злоупотреблением шаблоном? - PullRequest
1 голос
/ 05 ноября 2011

Я видел пример реализации шаблона CoR с использованием HashMap в качестве объекта, который передается по цепочке, возможно, с новым контентом, добавляемым к нему обработчиками; набросок кода ниже:

class HandlerImpl implements Handler {

     Handler next;

     void handle(HashMap context) {
         // do handler logic, perhaps adding new stuff to "context"
         if (next != null)
             next.handle();
     }
 }

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

Этот код пахнет? Если мы обнаружим, что мы не можем делать с шаблоном CoR, не дополнив объект контекста новой информацией, какой шаблон следует использовать в таком случае?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2011

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

Таким образом, каждый обработчик тесно связан (и явен) с точки зрения того, какие данные ему требуются / производятся, но он слабо связан с точки зрения того, что создает и потребляет этих данных .

В основном «лучший подход» будет зависеть от:

  • Что вы пытаетесь сделать
  • Какой язык / платформу вы используете (имеет ли он неизменную направленность? Имеет ли он статическую типизацию и непатентованные значения?)
1 голос
/ 05 ноября 2011

Я не думаю, что передача контекста по цепочке является нарушением шаблона.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...