设计模式之禅【迭代器模式】

真刀实枪之迭代器模式

  • 从整理项目说起

    • 老板要看项目,但是有点乱,让我整理下,简单,说干就干
    • 类图先上
    • 代码跟上

      • IProject

        package com.peng.ddq;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public interface IProject {
            // 老板从这里得到信息
            public String getProjectInfo();
        }
        
      • Project

        package com.peng.ddq;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public class Project implements IProject {
            // 项目名称
            private String name = "";
            // 项目数量成员
            private int num = 0;
            // 项目费用
            private int cost = 0;
        
            // 构造函数,把所有老板想看的项目都放进来
            public Project(String name, int num, int cost) {
                super();
                // 赋值到成员变量中
                this.name = name;
                this.num = num;
                this.cost = cost;
            }
        
            @Override
            public String getProjectInfo() {
                String info = "";
                info += "项目名称:" + this.name + ",\t项目人数:" + this.num + ",\t项目费用:"
                        + this.cost;
                return info;
            }
        
        }
        
      • Boss

        package com.peng.ddq;
        
        import java.util.ArrayList;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public class Boss {
            public static void main(String[] args) {
                // 定义一个List存放项目
                ArrayList<IProject> lists = new ArrayList<IProject>();
                // 添加项目
                lists.add(new Project("星球大战", 10, 1000200));
                lists.add(new Project("超人改造", 12, 1000020));
                lists.add(new Project("扭转时空", 11, 1002000));
                lists.add(new Project("改造宇宙", 13, 10024000));
                // 遍历项目
                for (IProject iProject : lists) {
                    System.out.println(iProject.getProjectInfo());
                }
            }
        }
        
      • 执行结果
        项目名称:星球大战,  项目人数:10,    项目费用:1000200
        项目名称:超人改造,  项目人数:12,    项目费用:1000020
        项目名称:扭转时空,  项目人数:11,    项目费用:1002000
        项目名称:改造宇宙,  项目人数:13,    项目费用:10024000
        
  • 老板去看报表了,但是作为一名逻辑工作者,当然得一日三省啦,可以自己来实现Iterator接口来玩一把嘛!

    • 来吧,先改类图
    • 然后修改代码【其中遇到形如的是泛型,相关内容可查看JDK1.5】

      • IProject

        package ddq2;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public interface IProject {
            // 增加项目
            public void add(String name, int num, int cost);
            //查看项目信息
            public String getProjectInfo();
            //获得一个可以遍历的对象
            public IProjectIterator iterator();
        }
        
      • Project

        package ddq2;
        
        import java.util.ArrayList;
        
        /**
         * @author kungfu~peg
         * @data 2017年11月24日
         * @description
         */
        public class Project implements IProject {
            // 项目列表
            private ArrayList<IProject> lists = new ArrayList<IProject>();
            // 项目名称
            private String name = "";
            // 项目数量
            private int num = 0;
            // 项目价格
            private int cost = 0;
        
            public Project() {
                super();
            }
        
            // 定义一个构造函数,存储信息
            private Project(String name, int num, int cost) {
                super();
                // 赋值到成员变量当中
                this.name = name;
                this.num = num;
                this.cost = cost;
            }
        
            @Override
            public void add(String name, int num, int cost) {
                lists.add(new Project(name, num, cost));
            }
        
            public String getProjectInfo() {
                String info = "";
                info += "项目名称:" + this.name + ",\t项目人数:" + this.num + ",\t项目费用:"
                        + this.cost;
                return info;
            }
        
            @Override
            public IProjectIterator iterator() {
                return new ProjectIterator(lists);
            }
        
        }
        
      • IProjectIterator

        package ddq2;
        
        import java.util.Iterator;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public interface IProjectIterator extends Iterator {
        
        }
        
      • ProjectIterator

        package ddq2;
        
        import java.util.ArrayList;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public class ProjectIterator implements IProjectIterator {
            // 项目列表
            private ArrayList<IProject> lists = new ArrayList<IProject>();
            private int currentItem = 0;
        
            // 构造函数
            public ProjectIterator(ArrayList<IProject> lists) {
                super();
                this.lists = lists;
            }
        
            // 判断是否有下一个元素
            @Override
            public boolean hasNext() {
                // 定义一个返回值
                boolean b = true;
                if (this.currentItem >= this.lists.size()
                        || this.lists.get(currentItem) == null) {
                    b = false;
                }
                return b;
            }
        
            // 返回下一个
            @Override
            public IProject next() {
                return (IProject) this.lists.get(this.currentItem++);
            }
        
            // 删除一个对象
            @Override
            public void remove() {
                // 暂时没用到
            }
        
        }
        
      • Boss

        package ddq2;
        
        /**
         * @author kungfu~peng
         * @data 2017年11月24日
         * @description
         */
        public class Boss {
            public static void main(String[] args) {
                // 定义一个项目对象
                IProject project = new Project();
                // 添加项目
                project.add("星球大战", 10, 1000200);
                project.add("超人改造", 12, 1000020);
                project.add("扭转时空", 11, 1002000);
                project.add("改造宇宙", 13, 10024000);
                // 遍历
                IProjectIterator iterator = project.iterator();
                while (iterator.hasNext()) {
                    System.out.println(((IProject) iterator.next()).getProjectInfo());
                }
        
            }
        }
        
      • 执行结果
        项目名称:星球大战,  项目人数:10,    项目费用:1000200
        项目名称:超人改造,  项目人数:12,    项目费用:1000020
        项目名称:扭转时空,  项目人数:11,    项目费用:1002000
        项目名称:改造宇宙,  项目人数:13,    项目费用:10024000
        

迭代器模式的定义

  • Iterator Pattern
  • Provide a way to access the elements of an arrregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象的各个元素,而又不需暴露该对象的内部细节)
  • 迭代器是为容器服务的,那什么是容器呢?能容纳所有类型的都已称之为容器【Collection,Set等】,迭代器模式就是为解决遍历这些容器中的元素而生的。
  • 通用类图
  • 迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器就可以了,迭代器使用相当的频繁,看看它的各个角色
    • Iterator抽象迭代器
      • 负责定义访问和遍历元素的接口,而且基本上有固定的三个方法【first:获得第一个元素】【next:访问下一个元素】【isDone是否已经访问到底部】
    • ConcreteIterator具体迭代器
    • Aggregate抽象容器
    • ConcreteAggregate具体容器
  • 通用代码

    • Iterator

      package ddq3;
      
      /**
       * @author kungfu~peng
       * @data 2017年11月24日
       * @description
       */
      public interface Iterator {
          // 遍历下一个元素
          public Object next();
      
          // 是否已经遍历到底部
          public boolean hasNext();
      
          // 删除当前指向的元素
          public boolean remove();
      }
      
    • ConcreteIterator

      package ddq3;
      
      import java.util.Vector;
      
      /**
       * @author kungfu~peng
       * @data 2017年11月24日
       * @description
       */
      public class ConcreteIterator implements Iterator {
          private Vector vector = new Vector();
      
          // 定义当前的游标
          public int cursor = 0;
      
          public ConcreteIterator(Vector vector) {
              super();
              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;
          }
      
      }
      
    • Aggregate

      package ddq3;
      
      /**
       * @author kungfu~peng
       * @data 2017年11月24日
       * @description
       */
      public interface Aggregate {
          // 添加元素
          public void add(Object object);
      
          // 减少元素
          public void remove(Object object);
      
          // 由迭代器来遍历所有的元素
          public Iterator iterator();
      }
      
    • ConcreteAggregate

      package ddq3;
      
      import java.util.Vector;
      
      /**
       * @author kungfu~peng
       * @data 2017年11月24日
       * @description
       */
      public class ConcreteAggregate implements Aggregate {
          // 容纳对象的容器
          private Vector vector = new Vector();
      
          // 增加一个元素
          @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(this.vector);
          }
      
      }
      
    • Client

      package ddq3;
      
      /**
       * @author kungfu~peng
       * @data 2017年11月24日
       * @description
       */
      public class Client {
          public static void main(String[] args) {
              // 声明出容器
              Aggregate agg = new ConcreteAggregate();
              // 产生对象数据放进去
              agg.add("a");
              agg.add("ab");
              agg.add("abc");
              agg.add("abcd");
              agg.add("abcde");
              agg.add("acbdef");
              Iterator iterator = agg.iterator();
              while (iterator.hasNext()) {
                  System.out.println(iterator.next());
              }
          }
      }
      
    • 执行结果
      a
      ab
      abc
      abcd
      abcde
      acbdef
      

迭代器模式的应用

  • for(Object o:容器){}的底层实现就是迭代器
  • java.util.Iterator在JDK1.2增加,并逐渐把Iterator应用到各个聚合类(Collection)
  • 现在很普遍,几乎迭代器模式要退出设计模式--因为它使用的太广泛了--Iterator的iterator方法一般就能满足你的需求

最佳实践

  • 如果你是做java开发,尽量不要自己写迭代器模式~~

声明

  • 摘自秦小波《设计模式之禅》第2版;
  • 仅供学习,严禁商业用途;
  • 代码手写,没有经编译器编译,有个别错误,自行根据上下文改正;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘风御浪云帆之上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值