Iterator pattern
This commit is contained in:
		
							
								
								
									
										82
									
								
								behavioral/iterator/iterator.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								behavioral/iterator/iterator.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//Iterator object should implement this interface
 | 
			
		||||
type Iterator interface {
 | 
			
		||||
	First()
 | 
			
		||||
	Next() bool
 | 
			
		||||
	Done() bool
 | 
			
		||||
	CurrentItem() interface{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//A list object should implement Iterable interface in order to be a iterable list
 | 
			
		||||
type Iterable interface {
 | 
			
		||||
	CreateIterator() Iterator
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Iterator object
 | 
			
		||||
type ListIterator struct {
 | 
			
		||||
	data  []string
 | 
			
		||||
	index int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *ListIterator) Done() bool {
 | 
			
		||||
	return i.index >= len(i.data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *ListIterator) CurrentItem() interface{} {
 | 
			
		||||
	return i.data[i.index]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *ListIterator) First() {
 | 
			
		||||
	i.index = 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (i *ListIterator) Next() bool {
 | 
			
		||||
	i.index++
 | 
			
		||||
	if i.Done() {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Actual a basic list object.I don't use abstraction here.
 | 
			
		||||
type List struct {
 | 
			
		||||
	data []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *List) Append(str string) {
 | 
			
		||||
	l.data = append(l.data, str)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *List) Count() int {
 | 
			
		||||
	return len(l.data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *List) CreateIterator() Iterator {
 | 
			
		||||
	listIterator := &ListIterator{data: l.data, index: -1}
 | 
			
		||||
	return listIterator
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Basic testing....
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	lst := &List{data: make([]string, 0)}
 | 
			
		||||
	lst.Append("A")
 | 
			
		||||
	lst.Append("B")
 | 
			
		||||
	lst.Append("C")
 | 
			
		||||
	lst.Append("D")
 | 
			
		||||
	lst.Append("E")
 | 
			
		||||
 | 
			
		||||
	//time to iterate...
 | 
			
		||||
	lstIterator := lst.CreateIterator()
 | 
			
		||||
	for lstIterator.Next() {
 | 
			
		||||
		fmt.Println("-", lstIterator.CurrentItem())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lstIterator.First()
 | 
			
		||||
	fmt.Println("First:", lstIterator.CurrentItem())
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user