第十六章 Caché 设计模式 迭代器模式
定义
提供一种方法顺序访问个聚合对象中各个元素,而又不暴露该对象的内部表示。
使用场景
- 提供一个list的遍历方法。目的很明确,弱化遍历算法和容器之间的关系。
- 根据传入的list额外提供一个遍历方法。
- 当需要对聚集有多种方式遍历时,可以考虑用迭代器模式。
结构图
描述
创建一个数组集合。
完整示例
定义迭代器接口
Class PHA.YX.Design.Iterator.Iterator Extends %RegisteredObject
{
Method HasNext() As %Boolean
{
}
Method Next()
{
}
}
实现迭代器接口
Class PHA.YX.Design.Iterator.IteratorImpl Extends Iterator
{
Property list As list Of %String;
Property cursor As %Integer [ InitialExpression = 0 ];
Method %OnNew(list) As %Status [ Private, ServerOnly = 1 ]
{
s ..list = list
Quit $$$OK
}
Method HasNext() As %Boolean
{
q ..cursor '= ..list.Count()
}
Method Next()
{
s obj = ""
i ..HasNext() d
.s ..cursor = ..cursor +1
.s obj = ..list.GetAt(..cursor)
q obj
}
}
定义容器接口
Class PHA.YX.Design.Iterator.Container Extends %RegisteredObject
{
Method add(obj)
{
}
Method remove(obj)
{
}
Method Iterator(obj) As Iterator
{
}
}
实现容器接口
Class PHA.YX.Design.Iterator.ContainerImpl Extends Container
{
Property list As List Of %String;
Method add(obj)
{
d ..list.Insert(obj)
}
Method remove(obj)
{
d ..list.RemoveAt(obj)
}
Method Iterator() As Iterator
{
q ##class(IteratorImpl).%New(..list)
}
}
调用
/// d ##class(PHA.YX.Design.Program).Iterator()
ClassMethod Iterator()
{
#dim container as PHA.YX.Design.Iterator.ContainerImpl
s container = ##class(PHA.YX.Design.Iterator.ContainerImpl).%New()
d container.add("Java")
d container.add("Cache")
d container.add("Kotlin")
d container.add("Flutter")
d container.add("Python")
d container.add("Swfit")
d container.add("Objective-c")
d container.add("C#")
#dim iterator as PHA.YX.Design.Iterator.Iterator
s iterator = container.Iterator()
while (iterator.HasNext()){
w iterator.Next(),!
}
}
DHC-APP>d ##class(PHA.YX.Design.Program).Iterator()
Java
Cache
Kotlin
Flutter
Python
Swfit
Objective-c
C#
思考
创建一个Person类有Name属性,添加,然后用迭代器模式遍历。