责任链设计模式有哪些替代方案?

17

我正在为一款业务应用程序构建邮件模块。情况是,当以某些输入作为响应发送邮件时,它们应该被分组,使用户不会收到连续几封带有不同项目的邮件,而只是一封包含所有项目的邮件。此外,邮件应按特定类型分组,这取决于创建邮件通知的输入类型,我有输入列表,每个输入都有其特定的分组类型,例如:

层次结构:员工 具有 流程 具有 请求 具有 活动

Activity 1: 按员工(因此接收者将在一封邮件中收到此活动类型下他拥有的所有流程的所有通知)

Activity 2: 按流程(接收者将获得所有此流程和此活动类型上所有请求的通知组成的一组通知)

Activity 3: 按请求(将分组此请求的活动)

Activity 4: 按活动(每个活动将单独发送一封邮件)

这些分组将经常发生变化。

你可能会认为,好吧,为了做到这一点,输入应该同时进行,以便邮件在同一时间生成并分组,否则系统将如何知道何时等待其他输入,何时只发送单独的邮件?..好吧,答案是两者都有,所以我正在设置一个定时器,让邮件服务每5分钟运行一次,一些立即邮件可能会延迟几分钟,但这是可以接受的权衡。

因此,我选择使用责任链设计模式,以下是结构:

MailGroupingStructure

所以我有两个接口IGroupingType,定义了每种类型应该如何,并具有2个方法:CalculateGrouping():确定是否为活动的分组。GroupEmailsToSend():如果这是分组,则获取邮件列表。

接口IGroupingHandler是调用每个分组类型的服务类,GetGroupingResult()只是在IGroupingType具体实现上调用2个方法,首先使用CalculateGrouping()获取正确分组,当它找到时,调用GroupEmailsToSend()。此接口还为每个分组注册下一个节点。

分组Enum只是用于返回分组计算结果。

然后还有EndOfChainSendingGrouping类,在找不到分组时我将立即发送邮件。

基本上我只需要一些关于这个结构的建议,因为我对这种模式还比较新,它是否有任何缺陷?我能改进什么?或者是否有更好的方法来完成这个任务?

提前感谢..


2
我认为[codereview.se]可能是一个更好的地方... - Peter Ritchie
1个回答

5

我认为链接起来听起来不错,似乎是最适合的。最终装饰器模式可以用于过滤接收者列表。


非常感谢您的光临,我一定会考虑您的建议。^_^ - specificityy
另一个关于装饰器模式的链接值得考虑:https://refactoring.guru/design-patterns/decorator - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接