mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-25 21:26:03 +03:00
79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package iterator
|
||
|
||
////////////////////////////////
|
||
//使用景点例子
|
||
|
||
//Iterator 游客地图是一个迭代器Iterator,为用户提供当前景区中不同景点的统一访问能力
|
||
type Iterator interface {
|
||
Reset() //重置
|
||
FirstPot() IPot //首个景点
|
||
IsLastPot() bool //当前景点是否是最后一个
|
||
Next() IPot //下一个景点
|
||
}
|
||
|
||
//IPot 景点对象的接口
|
||
type IPot interface {
|
||
Visit() //景点可以参观
|
||
}
|
||
|
||
//ScenicArea 景区包含所有的景点
|
||
type ScenicArea struct {
|
||
count int //景点的数量
|
||
pots []IPot //景点列表,景区可能一直在开发新的景点,所以景区的数量可能一直在增长
|
||
}
|
||
|
||
//PotsIterator 实现景区景点迭代器的对象
|
||
//PotsIterator 该对象的目的就是为了隐藏景区本身
|
||
//PotsIterator 实现为一个游标迭代器
|
||
type PotsIterator struct {
|
||
cursor int
|
||
potsSlice []IPot
|
||
}
|
||
|
||
//Iterator 返回一个接待
|
||
func (s *ScenicArea) Iterator() Iterator {
|
||
return &PotsIterator{
|
||
cursor: 0,
|
||
potsSlice: s.pots,
|
||
}
|
||
}
|
||
|
||
//AddPot 添加景点
|
||
func (s *ScenicArea) AddPot(pots ...IPot) {
|
||
for i := range pots {
|
||
s.count++
|
||
s.pots = append(s.pots, pots[i])
|
||
}
|
||
}
|
||
|
||
//PotsCount 添加景点
|
||
func (s *ScenicArea) PotsCount() int {
|
||
return s.count
|
||
}
|
||
|
||
//Reset 重置
|
||
func (s *PotsIterator) Reset() {
|
||
s.cursor = 0
|
||
}
|
||
|
||
//FirstPot 第一个景点
|
||
func (s *PotsIterator) FirstPot() IPot {
|
||
return s.potsSlice[0]
|
||
}
|
||
|
||
//IsLastPot 判断游标的位置
|
||
func (s *PotsIterator) IsLastPot() bool {
|
||
return s.cursor == -1
|
||
}
|
||
|
||
//Next 去路线上的下一个景点
|
||
func (s *PotsIterator) Next() IPot {
|
||
if s.cursor+1 == len(s.potsSlice) {
|
||
s.cursor = -1 //设置到最后
|
||
return nil
|
||
}
|
||
s.cursor++
|
||
return s.potsSlice[s.cursor]
|
||
|
||
}
|