其他设计模式的链接:http://blog.csdn.net/wj903829182/article/category/7068746
这里来了解下设计模式的迭代模式。
一 迭代模式的简单实现案例
1,类图
看上面的代码是不是有点复杂,下面我们来实现代码,可能看代码根据清晰。
项目信息接口:
package com.jack.interator;
/**
* Created by jack on 2018/1/26.
* 项目信息接口
*/
public interface IProject {
//增加项目
void add(String name,int num,int cost);
//获取项目信息
String getProjectInfo();
//获得一个可以遍历的对象
IProjectIterator iterator();
}
package com.jack.interator;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jack on 2018/1/26.
*/
public class Project implements IProject {
//定义一个项目列表,所有的项目都放在这里
private List<IProject> projectList = new ArrayList<>();
//项目名
private String name = "";
//项目成员数量
private int num = 0;
//项目费用
private int cost = 0;
public Project() {
}
/**
* 定义一个构造函数,把所有需要看的信息存储起来
* @param name
* @param num
* @param cost
*/
public Project(String name, int num, int cost) {
this.name = name;
this.num = num;
this.cost = cost;
}
/**
* 增加项目
* @param name
* @param num
* @param cost
*/
@Override
public void add(String name, int num, int cost) {
this.projectList.add(new Project(name, num, cost));
}
/**
* 得到项目信息
* @return
*/
@Override
public String getProjectInfo() {
String info = "";
info = info+"项目名称:"+this.name;
info = info+"\t项目人数:"+this.num;
info = info+"\t项目费用:"+this.cost;
return info;
}
/**
* 产生一个遍历对象
* @return
*/
@Override
public IProjectIterator iterator() {
return new ProjectIterator(this.projectList);
}
}
迭代器接口:
package com.jack.interator;
import java.util.Iterator;
/**
* Created by jack on 2018/1/26.
* 项目迭代器接口
*/
public interface IProjectIterator extends Iterator {
}
项目迭代器:
package com.jack.interator;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jack on 2018/1/26.
* 项目迭代器
*/
public class ProjectIterator implements IProjectIterator {
//保存所有项目
private List<IProject> projectList = new ArrayList<>();
private int currentItem = 0;
public ProjectIterator(List<IProject> projectList) {
this.projectList = projectList;
}
/**
* 判断是否还有元素,必须实现
* @return
*/
@Override
public boolean hasNext() {
boolean result = true;
if (this.currentItem >= this.projectList.size() || this.projectList.get(this.currentItem) == null) {
result = false;
}
return result;
}
/**
* 取得下一个值
* @return
*/
@Override
public IProject next() {
return this.projectList.get(this.currentItem++);
}
//删除对象,暂时不实现
@Override
public void remove() {
}
}
下面看看测试代码:
package com.jack.interator;
/**
* Created by jack on 2018/1/26.
*/
public class Boss {
public static void main(String[] args) {
//定义一个项目对象,里面有一个list存放所有的项目
IProject project = new Project();
project.add("星球大战项目",10,1000000);
project.add("人月神话项目",100,10000000);
project.add("超人改造项目",20,88998989);
//循环添加项目
for (int i=4;i<104;i++) {
project.add("第"+i+"个项目",i*5,i*1000);
}
//遍历list,取出所有数据
IProjectIterator projectIterator = project.iterator();
while (projectIterator.hasNext()) {
IProject project1 = (IProject) projectIterator.next();
System.out.println(project1.getProjectInfo());
}
}
}
测试结果:
项目名称:星球大战项目 项目人数:10 项目费用:1000000
项目名称:人月神话项目 项目人数:100 项目费用:10000000
项目名称:超人改造项目 项目人数:20 项目费用:88998989
项目名称:第4个项目 项目人数:20 项目费用:4000
项目名称:第5个项目 项目人数:25 项目费用:5000
项目名称:第6个项目 项目人数:30 项目费用:6000
项目名称:第7个项目 项目人数:35 项目费用:7000
项目名称:第8个项目 项目人数:40 项目费用:8000
项目名称:第9个项目 项目人数:45 项目费用:9000
项目名称:第10个项目 项目人数:50 项目费用:10000
项目名称:第11个项目 项目人数:55 项目费用:11000
项目名称:第12个项目 项目人数:60 项目费用:12000
项目名称:第13个项目 项目人数:65 项目费用:13000
项目名称:第14个项目 项目人数:70 项目费用:14000
项目名称:第15个项目 项目人数:75 项目费用:15000
项目名称:第16个项目 项目人数:80 项目费用:16000
项目名称:第17个项目 项目人数:85 项目费用:17000
项目名称:第18个项目 项目人数:90 项目费用:18000
项目名称:第19个项目 项目人数:95 项目费用:19000
项目名称:第20个项目 项目人数:100 项目费用:20000
项目名称:第21个项目 项目人数:105 项目费用:21000
项目名称:第22个项目 项目人数:110 项目费用:22000
项目名称:第23个项目 项目人数:115 项目费用:23000
项目名称:第24个项目 项目人数:120 项目费用:24000
项目名称:第25个项目 项目人数:125 项目费用:25000
项目名称:第26个项目 项目人数:130 项目费用:26000
项目名称:第27个项目 项目人数:135 项目费用:27000
项目名称:第28个项目 项目人数:140 项目费用:28000
项目名称:第29个项目 项目人数:145 项目费用:29000
项目名称:第30个项目 项目人数:150 项目费用:30000
项目名称:第31个项目 项目人数:155 项目费用:31000
项目名称:第32个项目 项目人数:160 项目费用:32000
项目名称:第33个项目 项目人数:165 项目费用:33000
项目名称:第34个项目 项目人数:170 项目费用:34000
项目名称:第35个项目 项目人数:175 项目费用:35000
项目名称:第36个项目 项目人数:180 项目费用:36000
项目名称:第37个项目 项目人数:185 项目费用:37000
项目名称:第38个项目 项目人数:190 项目费用:38000
项目名称:第39个项目 项目人数:195 项目费用:39000
项目名称:第40个项目 项目人数:200 项目费用:40000
项目名称:第41个项目 项目人数:205 项目费用:41000
项目名称:第42个项目 项目人数:210 项目费用:42000
项目名称:第43个项目 项目人数:215 项目费用:43000
项目名称:第44个项目 项目人数:220 项目费用:44000
项目名称:第45个项目 项目人数:225 项目费用:45000
项目名称:第46个项目 项目人数:230 项目费用:46000
项目名称:第47个项目 项目人数:235 项目费用:47000
项目名称:第48个项目 项目人数:240 项目费用:48000
项目名称:第49个项目 项目人数:245 项目费用:49000
项目名称:第50个项目 项目人数:250 项目费用:50000
项目名称:第51个项目 项目人数:255 项目费用:51000
项目名称:第52个项目 项目人数:260 项目费用:52000
项目名称:第53个项目 项目人数:265 项目费用:53000
项目名称:第54个项目 项目人数:270 项目费用:54000
项目名称:第55个项目 项目人数:275 项目费用:55000
项目名称:第56个项目 项目人数:280 项目费用:56000
项目名称:第57个项目 项目人数:285 项目费用:57000
项目名称:第58个项目 项目人数:290 项目费用:58000
项目名称:第59个项目 项目人数:295 项目费用:59000
项目名称:第60个项目 项目人数:300 项目费用:60000
项目名称:第61个项目 项目人数:305 项目费用:61000
项目名称:第62个项目 项目人数:310 项目费用:62000
项目名称:第63个项目 项目人数:315 项目费用:63000
项目名称:第64个项目 项目人数:320 项目费用:64000
项目名称:第65个项目 项目人数:325 项目费用:65000
项目名称:第66个项目 项目人数:330 项目费用:66000
项目名称:第67个项目 项目人数:335 项目费用:67000
项目名称:第68个项目 项目人数:340 项目费用:68000
项目名称:第69个项目 项目人数:345 项目费用:69000
项目名称:第70个项目 项目人数:350 项目费用:70000
项目名称:第71个项目 项目人数:355 项目费用:71000
项目名称:第72个项目 项目人数:360 项目费用:72000
项目名称:第73个项目 项目人数:365 项目费用:73000
项目名称:第74个项目 项目人数:370 项目费用:74000
项目名称:第75个项目 项目人数:375 项目费用:75000
项目名称:第76个项目 项目人数:380 项目费用:76000
项目名称:第77个项目 项目人数:385 项目费用:77000
项目名称:第78个项目 项目人数:390 项目费用:78000
项目名称:第79个项目 项目人数:395 项目费用:79000
项目名称:第80个项目 项目人数:400 项目费用:80000
项目名称:第81个项目 项目人数:405 项目费用:81000
项目名称:第82个项目 项目人数:410 项目费用:82000
项目名称:第83个项目 项目人数:415 项目费用:83000
项目名称:第84个项目 项目人数:420 项目费用:84000
项目名称:第85个项目 项目人数:425 项目费用:85000
项目名称:第86个项目 项目人数:430 项目费用:86000
项目名称:第87个项目 项目人数:435 项目费用:87000
项目名称:第88个项目 项目人数:440 项目费用:88000
项目名称:第89个项目 项目人数:445 项目费用:89000
项目名称:第90个项目 项目人数:450 项目费用:90000
项目名称:第91个项目 项目人数:455 项目费用:91000
项目名称:第92个项目 项目人数:460 项目费用:92000
项目名称:第93个项目 项目人数:465 项目费用:93000
项目名称:第94个项目 项目人数:470 项目费用:94000
项目名称:第95个项目 项目人数:475 项目费用:95000
项目名称:第96个项目 项目人数:480 项目费用:96000
项目名称:第97个项目 项目人数:485 项目费用:97000
项目名称:第98个项目 项目人数:490 项目费用:98000
项目名称:第99个项目 项目人数:495 项目费用:99000
项目名称:第100个项目 项目人数:500 项目费用:100000
项目名称:第101个项目 项目人数:505 项目费用:101000
项目名称:第102个项目 项目人数:510 项目费用:102000
项目名称:第103个项目 项目人数:515 项目费用:103000
二 迭代器模式的定义
迭代器模式模式目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发。定义如下:它提供一种方法访问一个容器对象各个元素,而又不暴露该对象的内部细节。
迭代器是为容器服务的,那么什么是容器呢?能容纳对象的所有类型都可以称之为容器,例如Collection集合类型,Set类型等,迭代器模式就是为了解决遍历这些容器中的元素而诞生的。其通用类图如下:
迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器进行。
Iterator抽象迭代器:
抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,hasNext()是否已经访问到底部了。
ConcreteIterator具体迭代器:
具体迭代器角色要实现迭代器接口,完成容器元素的遍历。
Aggregate抽象容器:
容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator这样的方法,在java中一般是iterator方法。
Concrete Aggregate具体容器:
具体容器实现容器接口定义的方法,创建出容器迭代器的对象。
通用迭代器的代码和上面的差不多这里就不列出来了,代码参考:
https://github.com/wj903829182/springboot/tree/master/designpattern/src/main/java/com/jack/interator
欢迎加群交流:331227121