Ведение журнала ответственности - PullRequest
2 голосов
/ 19 августа 2011

У меня есть абстрактный класс ChainHandler и много реализаций ChainHandler.

Другие программисты напишут другие реализации этого ChainHandler.

Моя программа реализует шаблон проектирования Chain of Responsibility.

Каждая конкретная реализация ChainHandler реализует метод дескриптора.

public abstract void handle(SomeclassA a);

Если один обработчик может обрабатывать «a», он обрабатывает его, и цепь останавливается.Если нет, то «a» передается следующему обработчику, пока он не достигнет конца цепочки.

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

Есть ли элегантный способ сделать это?

Моя лучшая идея заключалась в следующем:

1 - Измените метод handle на protected в конкретных классах, сделайте так, чтобы он возвращал логическое значение, и измените имя на innerhandle;

2 - Измените метод handle в абстрактном классе на publicи это вызывает внутреннюю ручку.В случае успеха он добавляет объект в список.

1 Ответ

2 голосов
/ 19 августа 2011

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

API сервлета имеет такой пример, метод init , который принимает параметр ServletConfig , может быть переопределен, и довольно часто можно увидеть, что люди забывают назвать super и оригинал init (ServletConfig) метод, поэтому вы должны попытаться избежать этой же ошибки.

...