23种设计模式:迭代器模式
迭代器模式
1.介绍
概念
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
主要作用
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
解决的问题
不同的方式来遍历整个整合对象。
使用场景
1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
(引用自菜鸟教程)
2.实现
背景
类UsernameList用来储存用户的姓名,利用迭代器模式创建一个迭代器类用来遍历UsernameList。
java实现
1.创建Iterator接口
public interface Iterator {
public boolean hasNext();
public Object next();
}
2.创建Container接口
public interface Container {
public Iterator getIterator();
}
3.创建USernameList
public class UsernameList implements Container{
private String[] usernames = {"zhangsan", "lisi", "wangwu"};
@Override
public Iterator getIterator() {
return new UserIterator(usernames);
}
}
- 创建UserIterator类
public class UserIterator implements Iterator{
String[] usernames;
int index;
public UserIterator(String[] usernames) {
this.usernames = usernames;
}
@Override
public boolean hasNext() {
if (index < usernames.length) {
return true;
}
return false;
}
@Override
public Object next() {
if (index < usernames.length) {
return usernames[index++];
}
return null;
}
}
5.创建测试类
public class IteratorPatternDemo {
public static void main(String[] args) {
UsernameList usernameList = new UsernameList();
Iterator iterator = usernameList.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
6.运行结果
zhangsan
lisi
wangwu
golang实现
package IteratorPattern
// Iterator 创建Iterator接口
type Iterator interface {
hasNext() bool
next() interface{}
}
// Container 创建Container接口
type Container interface {
getIterator() Iterator
}
// UserIterator 创建UserIterator
type UserIterator struct {
usernames []string
index int
}
func (u *UserIterator) hasNext() bool {
if u.index < len(u.usernames) {
return true
}
return false
}
func (u *UserIterator) next() interface{} {
if u.index < len(u.usernames) {
u.index++
return u.usernames[u.index - 1]
}
return nil
}
// UsernameList 创建UsernameList
type UsernameList struct {
usernames []string
}
func (u *UsernameList) getIterator() Iterator {
return &UserIterator{
usernames: u.usernames,
}
}
func NewUsernameList(usernames []string) *UsernameList {
return &UsernameList{
usernames: usernames,
}
}
package IteratorPattern
import (
"fmt"
"testing"
)
func TestIteratorPatternDemo(t *testing.T) {
//str := []string{"123", "456"}
usernameList := NewUsernameList([]string{"zhangsan", "lisi", "wangwu"})
iterator := usernameList.getIterator()
for iterator.hasNext() {
fmt.Println(iterator.next())
}
}
=== RUN TestIteratorPatternDemo
zhangsan
lisi
wangwu
--- PASS: TestIteratorPatternDemo (0.00s)
PASS