2020-04-21 22:50:21 +08:00
|
|
|
|
package iterator
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
////////////////////////////////
|
|
|
|
|
//使用景点例子
|
2020-04-21 22:50:21 +08:00
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//ITouristMap 游客地图是一个迭代器Iterator,为用户提供当前景区中不同景点的统一访问能力
|
|
|
|
|
type ITouristMap interface {
|
|
|
|
|
FirstPot() //首个景点
|
|
|
|
|
IsLastPot() bool //当前景点是否是最后一个
|
|
|
|
|
Next() interface{} //下一个景点
|
2020-04-21 22:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//IScenicArea 是一个针对景区的Aggregate聚合类型接口,返回一个迭代器接口
|
|
|
|
|
//IScenicArea 返回一个游客访问接口
|
|
|
|
|
type IScenicArea interface {
|
|
|
|
|
Iterator() ITouristMap
|
2020-04-21 22:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//ScenicArea 景区包含所有的景点
|
|
|
|
|
type ScenicArea struct {
|
|
|
|
|
count int //景点的数量
|
|
|
|
|
pots []interface{} //景点列表,景区可能一直在开发新的景点,所以景区的数量可能一直在增长
|
2020-04-21 22:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//Iterator 通过
|
|
|
|
|
func (s *ScenicArea) Iterator() ITouristMap {
|
|
|
|
|
return &ScenicAreaPotsMap{
|
2020-04-21 22:50:21 +08:00
|
|
|
|
numbers: n,
|
|
|
|
|
next: n.start,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//ScenicAreaPotsMap 就是景区提供的迭代器类型,要实现具体的景区景点的迭代访问能力
|
|
|
|
|
type ScenicAreaPotsMap struct {
|
2020-04-21 22:50:21 +08:00
|
|
|
|
numbers *Numbers
|
|
|
|
|
next int
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//FirstPot 第一个景点
|
|
|
|
|
func (i *ScenicAreaPotsMap) FirstPot() {
|
2020-04-21 22:50:21 +08:00
|
|
|
|
i.next = i.numbers.start
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//IsLastPot 是否是最后一个
|
|
|
|
|
func (i *ScenicAreaPotsMap) IsLastPot() bool {
|
2020-04-21 22:50:21 +08:00
|
|
|
|
return i.next > i.numbers.end
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-03 02:53:02 +08:00
|
|
|
|
//Next 去路线上的下一个景点
|
|
|
|
|
func (i *ScenicAreaPotsMap) Next() interface{} {
|
2020-04-21 22:50:21 +08:00
|
|
|
|
if !i.IsDone() {
|
|
|
|
|
next := i.next
|
|
|
|
|
i.next++
|
|
|
|
|
return next
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|