本文是关于 Design-Pattern 实施的讨论的延续,该 design-Pattern 先前在Bersolek Ria dengan Decorator-pattern上进行了讨论。域问题和来源代码使用的是以前的讨论的延续。
序言
您工作的公司事实证明,与您管理的应用程序有无数的想法和计划。今天,您,您的老板和产品所有者 do 虚拟会议与应用程序相关的增强。讨论以通过老板埋葬给您的任务结束。
您被要求添加一个函数,以过滤每个员工,以将警告通知发送到存在的源代码。目前,您的申请是“盲目的”,通过向每个级别的所有雇员发送警告通知而不考虑员工的状态是否处于活动状态。
开放以关闭扩展以进行修改
您的老板要求在需要它的功能时,可以在任何地方使用过滤器。如果需要以不同的方式过滤员工,则预计过滤器也将不需要修改。然后,您的老板叫一个可以完全改变您生活的词,他说
“ 尝试学习迭代器模式 ”
迭代器
从老板那里获得说明后,您决定在这种情况下使用迭代器模式。您计划创建一个仅负责过滤员工活动状态的对象。您还知道,通过使用模式此迭代器,如果需要的话,可以轻松添加。
iterator.go
type Iterator interface {
GetNext() Employee
HasMore() bool
}
active_employee_iterator.go
type ActiveEmployeeIterator struct {
Employees []entity.Employee
CurrentPosition int
Status bool
}
func (iter *ActiveEmployeeIterator) GetNext() entity.Employee {
if !iter.HasMore() {
return nil
}
employee := iter.Employees[iter.CurrentPosition]
iter.CurrentPosition++
if employee.GetStatus() {
return employee
}
return iter.GetNext()
}
func (iter *ActiveEmployeeIterator) HasMore() bool {
if iter.CurrentPosition >= len(iter.Employees) {
return false
}
employee := iter.Employees[iter.CurrentPosition]
if employee.GetStatus() {
return iter.CurrentPosition < len(iter.Employees)
}
iter.CurrentPosition++
return iter.HasMore()
}
func NewActiveEmployeeIterator(employees []entity.Employee, status bool) *ActiveEmployeeIterator {
return &ActiveEmployeeIterator{Employees: employees, Status: status}
}
在程序上调用迭代器;
main.go
// iterate only for active employee
employeesIter := iterator.NewActiveEmployeeIterator(employees, true)
for employeesIter.HasMore() {
employee := employeesIter.GetNext()
// accept performance notification visitor
employee.Accept(performanceNotification)
// accept bonus income visitor
employee.Accept(bonusIncome)
}
结语
与本文相关的整个源代码可以在https://github.com/Mhakimamransyah/practice-design-pattern
之后的存储库中看到阅读参考
https://refactoring.guru/design-patterns/iterator
作者
https://github.com/Mhakimamransyah
https://www.linkedin.com/in/hakim-amr/
mailto: m.hakim.amransyah.hakim@gmail.com