设计模式14-迭代器模式

          其他设计模式的链接: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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值