您的位置:首页 > 其它

迭代器模式

2016-03-20 21:07 295 查看
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

迭代器模式的通用类图



迭代器模式的通用源码

抽象迭代器(接口)

public interface Iterator {

//遍历下一个元素
public Object next();
//是否已经遍历到尾部
public boolean hasNext();
//删除当前指向的元素
public boolean remove();
}


具体迭代器类

public class ConcreteIterator implements Iterator {

private Vector<Object> vector = new Vector<>();
//定义当前的游标
private int cursor = 0;

public ConcreteIterator(Vector<Object> _vector) {
this.vector = _vector;
}

@Override
public Object next() {
Object result = null;
if (this.hasNext()) {
result = this.vector.get(this.cursor++);
}
else {
result = null;
}
return result;
}

@Override
public boolean hasNext() {
if (this.cursor == this.vector.size()) {
return false;
}
else {
return true;
}
}

@Override
public boolean remove() {
this.vector.remove(this.cursor++);
return true;
}

}


抽象容器(接口)

public interface Aggregate {

//是容器必然有元素的增加
public void add(Object object);
//减少元素
public void remove(Object object);
//由迭代器来遍历所有的元素
public Iterator iterator();

}


具体容器类

public class ConcreteAggregate implements Aggregate {

private Vector<Object> vector = new Vector<Object>();

@Override
public void add(Object object) {
this.vector.add(object);
}

@Override
public void remove(Object object) {
this.vector.remove(object);
}

@Override
public Iterator iterator() {
return new ConcreteIterator(vector);
}

}


场景类

public class Client {

public static void main(String[] args) {

//声明出容器
Aggregate aggregate = new ConcreteAggregate();
//产生对象数据放进去
aggregate.add("abc");
aggregate.add("ass");
aggregate.add("121");
//遍历
Iterator iterator = aggregate.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}


迭代器模式的应用

从事java开发,就不需要自己写迭代器模式了,Java本省提供的Iterator一般都能满足开发的需要。

迭代器模式的简单应用

迭代器模式的简单应用前奏—类图及源码



项目信息的接口

public interface IProject {

//获取项目的信息
public String getProjectInfo();

}


项目信息的具体实现类

public class Project implements IProject {

//项目的名字
private String name = "";
//项目成员数量
private int num = 0;
//项目费用
private int cost = 0;

//定义一个构造函数,把所有的项目信息存储下来
public Project(String _name, int _num, int _cost) {
this.name = _name;
this.num = _num;
this.cost = _cost;
}

@Override
public String getProjectInfo() {
String info = "";
info = info + "项目名称:" + this.name;
info = info + "/t项目成员数:" + this.num;
info = info + "/t项目费用:" + this.cost;
return info;
}

}


场景类

public class Client {

public static void main(String[] args) {

ArrayList<IProject> list = new ArrayList<IProject>();

for (int i = 0; i < 20; i++) {
list.add(new Project("hello" + i, i * 2, i * 2500));
}

for (IProject project : list) {
System.out.println(project.getProjectInfo());
}
}
}


迭代器模式的简单应用—类图及源码



项目信息接口

public interface IProject {

//增加项目
public void add(String name, int num, int cost);
//项目的全部信息
public String getProjectInfo();
//获得一个可以被遍历的对象
public IProjectIterator iterator();
}


项目信息具体实现类

public class Project implements IProject {

//定义一个项目列表,将所有的项目都放入其中
private ArrayList<IProject> list = new ArrayList<IProject>();
//项目名称
private String name = "";
//项目成员数量
private int num = 0;
//项目费用
private int cost = 0;

public Project() {

}

//定义构造函数,把所有的项目信息存储起来
public Project(String _name, int _num, int _cost) {
this.name = _name;
this.num = _num;
this.cost = _cost;
}

@Override
public void add(String name, int num, int cost) {
this.list.add(new Project(name, num, cost));
}

@Override
public String getProjectInfo() {
String info = "";
info = "项目名称:" + this.name;
info = info + "\t项目成员数:" + this.num;
info = info + "\t项目费用:" + this.cost;
return info;
}

@Override

public IProjectIterator iterator() {
return new ProjectIterator(this.list);
}

}


定义自己的迭代器接口

public interface IProjectIterator extends Iterator<Object> {
//不用做任何事情
}


定义自己的迭代器接口的具体实现

public class ProjectIterator implements IProjectIterator {

//将所有的项目放入到ArrayList中
private ArrayList<IProject> list = new ArrayList<IProject>();

private int currentItem = 0;

//构造函数传入ArrayList中
public ProjectIterator(ArrayList<IProject> _list) {
this.list = _list;
}

@Override
public boolean hasNext() {
boolean b = true;
if (this.currentItem >= list.size() || this.list.get(currentItem) == null) {
b = false;
}
return b;
}

@Override
public Object next() {
return this.list.get(this.currentItem++);
}

@Override
public void remove() {

}

}


场景类

public class Client {

public static void main(String[] args) {

IProject project = new Project();
for (int i = 0; i < 20; i++) {
project.add("hello" + i, i * 2, i * 2500);
}
IProjectIterator iterator = project.iterator();
while (iterator.hasNext()) {
IProject p =  (IProject) iterator.next();
System.out.println(p.getProjectInfo());
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: