Каковы альтернативы шаблону проектирования цепочки ответственности? - программирование
Подтвердить что ты не робот

Каковы альтернативы шаблону проектирования цепочки ответственности?

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

Иерархия: Сотрудник имеет Процессы имеет Запросы имеет Деятельность

Действие 1: Сотрудник (так что получатель получит все уведомления о процессах, которые он владеет этим типом активности, всего за одну почту)

Действие 2: По процессу (получатель получит группу всех уведомлений обо всех запросах этого процесса и этом типе активности)

Действие 3: По запросу (действия этого запроса будут сгруппированы)

Действие 4: По видам деятельности (каждое действие будет отправлено по отдельному письму)

Эти группы будут постоянно меняться.

Вы можете подумать, что для того, чтобы сделать это, нужно сделать сразу, чтобы почтовые сообщения были сгенерированы одновременно и поэтому сгруппированы, иначе как система будет знать, когда ждать других входов и когда просто отправлять отдельный mail?.. ну, и ответ - это то, что я делаю, это установка таймера, чтобы почтовая служба запускалась каждые 5 минут, некоторые немедленные сообщения могли задерживаться на несколько минут, но это доступный компромисс.

Итак, я решил использовать эту цепочку дизайна ответственности и здесь структура:

MailGroupingStructure

Итак, у меня есть два интерфейса IGroupingType, который определяет, как должен выглядеть каждый тип, и имеет 2 метода: CalculateGrouping(): определяет, является ли это группировкой активности. GroupEmailsToSend(): если это группировка, получает список писем.

Интерфейс IGroupingHandler - это класс службы, который будет вызывать каждый тип группировки, GetGroupingResult() просто вызывает 2 метода в бетонных реализациях IGroupingType, сначала CalculateGrouping(), чтобы получите правильную группировку, когда она найдет ее, вызывает GroupEmailsToSend(). Этот интерфейс также регистрирует next node в цепочке для каждой группы.

Группировка Enum предназначена только для возврата результата вычисления группировки.

И затем также класс EndOfChainSendingGrouping, если не было обнаружено группировки, я просто отправлю почту сразу.

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

Спасибо заранее.

4b9b3361

Ответ 1

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