带有图案装饰的pented ria
#go #designpatterns #indonesia

本文是对 Design-Pattern 实施的讨论的延续,该 先前在 lebih dekat dengan visitor-pattern 中进行了讨论。域问题和来源代码使用的是以前的讨论的延续。

序言

当时每日标准昨天,您从老板那里得到了 Enhance 的指示,以发送已发出警告通知的功能。以前,您仅使用一个简单的功能将警告通知发送到所有员工级别。您的老板要求能够容纳使用几种不同媒体发送通知的源代码。您的老板要求的规定是

  • 所有级别的员工将通过公司的移动应用程序收到通知
  • 除了推送通知主管可以通过电子邮件接收通知。
  • 除了推送通知经理可以通过电子邮件和消息接收通知 whatsapp

通常,您的应用程序当前具有以下类关系;

Image description

发送警告通知的责任目前由对象 performAceArningvisitor 进行,这是访问者的实现(在 lebih dekat dengan visitor-pattern 中进行了说明)。 P>

重新调整对象

您知道当前警告通知仅通过推送通知发送。根据给出的规定,您必须添加其他通知媒体,而无需删除或消除当前使用的默认通知。

您意识到,建立一个单位对象不是一个好主意,因为(再次)每种类型的通知都会与其他类型的通知一起积累。简单地说这些规定可以解释如下

staf - > 推送通知
主管 - > 推送通知 |电子邮件
manajer - > 推送通知 |电子邮件| WhatsApp编号

装饰器图案

很长一段时间后监禁,您最终决定使用 Deminator 来处理这种情况。您将制作一个 decorator 将重新定义推动 - 命中率函数,以便它具有不同的媒体通知功能。

Image description

根据现有的员工级别,您可以制作一个类型负责制作汇编各种 demanter 。简而言之,课程的实现如下;

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