本文是对 Design-Pattern 实施的讨论的延续,该 先前在 lebih dekat dengan visitor-pattern 中进行了讨论。域问题和来源代码使用的是以前的讨论的延续。
序言
当时每日标准昨天,您从老板那里得到了 Enhance 的指示,以发送已发出警告通知的功能。以前,您仅使用一个简单的功能将警告通知发送到所有员工级别。您的老板要求能够容纳使用几种不同媒体发送通知的源代码。您的老板要求的规定是
- 所有级别的员工将通过公司的移动应用程序收到通知
- 除了推送通知,主管可以通过电子邮件接收通知。
- 除了推送通知,经理可以通过电子邮件和消息接收通知 whatsapp 。
通常,您的应用程序当前具有以下类关系;
发送警告通知的责任目前由对象 performAceArningvisitor 进行,这是访问者的实现(在 lebih dekat dengan visitor-pattern 中进行了说明)。 P>
您知道当前警告通知仅通过推送通知发送。根据给出的规定,您必须添加其他通知媒体,而无需删除或消除当前使用的默认通知。 您意识到,建立一个单位对象不是一个好主意,因为(再次)每种类型的通知都会与其他类型的通知一起积累。简单地说这些规定可以解释如下 staf - > 推送通知 很长一段时间后监禁,您最终决定使用 Deminator 来处理这种情况。您将制作一个 decorator 将重新定义推动 - 命中率函数,以便它具有不同的媒体通知功能。 根据现有的员工级别,您可以制作一个类型
重新调整对象
主管 - > 推送通知 |电子邮件
manajer - > 推送通知 |电子邮件| WhatsApp编号
装饰器图案
notification_factory.go
type NotificatorContract interface {
StaffNotifier() entity.Notifier
SupervisorNotifier() entity.Notifier
ManagerNotifier() entity.Notifier
}
type Notificator struct{}
func (notifier *Notificator) StaffNotifier() entity.Notifier {
return decorator.NewPushNotificationDecorator()
}
func (notifier *Notificator) SupervisorNotifier() entity.Notifier {
pushNotification := decorator.NewPushNotificationDecorator()
emailNotification := decorator.NewEmailDecorator(pushNotification)
return emailNotification
}
func (notifier *Notificator) ManagerNotifier() entity.Notifier {
pushNotification := decorator.NewPushNotificationDecorator()
emailNotification := decorator.NewEmailDecorator(pushNotification)
whatsAppNotification := decorator.NewWhatsAppDecorator(emailNotification)
return whatsAppNotification
}
func NewNotificator() *Notificator {
return &Notificator{}
}
Factory 以后将由对象 performancingvisitor 。
performance_warning_visitor.go
type PerformanceWarningVisitor struct {
Notif factory.NotificatorContract
}
func (visitor PerformanceWarningVisitor) VisitStaff(staff *entities.Staff) (interface{}, error) {
var warningType string
notification := visitor.Notif.StaffNotifier()
if staff.PerformancePercentage < 30 {
warningType = STERN_WARNING
}
if staff.PerformancePercentage >= 30 && staff.PerformancePercentage < 67 {
warningType = WARNING
}
notification.SendMessage(
staff,
fmt.Sprintf("Notification %s send to staff : %s \n", warningType, staff.Name),
)
return warningType, nil
}
func (visitor PerformanceWarningVisitor) VisitSupervisor(spv *entities.Supervisor) (interface{}, error) {
var warningType string
durationInYear := (time.Now()).Sub(spv.JoinDate).Hours() / 8760
notification := visitor.Notif.SupervisorNotifier()
if spv.PerformancePercentage < 30 {
warningType = STERN_WARNING
}
if durationInYear >= 10 && (spv.PerformancePercentage >= 30 && spv.PerformancePercentage < 60) {
warningType = WARNING
}
if durationInYear < 10 && (spv.PerformancePercentage >= 30 && spv.PerformancePercentage < 70) {
warningType = WARNING
}
notification.SendMessage(
spv,
fmt.Sprintf("Notification %s send to supervisor : %s \n", warningType, spv.Name),
)
return warningType, nil
}
func (visitor PerformanceWarningVisitor) VisitManager(manager *entities.Manager) (interface{}, error) {
var warningType string
Age := (time.Now()).Sub(manager.BirthDate).Hours() / 8760
notification := visitor.Notif.ManagerNotifier()
if manager.PerformancePercentage < 40 {
warningType = STERN_WARNING
}
if Age >= 40 && (manager.PerformancePercentage >= 40 && manager.PerformancePercentage < 60) {
warningType = WARNING
}
if Age < 40 && (manager.PerformancePercentage >= 40 && manager.PerformancePercentage < 70) {
warningType = WARNING
}
notification.SendMessage(
manager,
fmt.Sprintf("Notification %s send to manager : %s \n", warningType, manager.Name),
)
return warningType, nil
}
结语
可以在以下存储库https://github.com/Mhakimamransyah/practice-design-pattern
中看到与本文相关的所有来源代码 阅读参考
https://refactoring.guru/design-patterns/decorator
https://www.youtube.com/watch?v=metYIcjQLls
作者
https://github.com/Mhakimamransyah
https://www.linkedin.com/in/hakim-amr/
mailto:m.hakim.amransyah.hakim@gmail.com