设计模式--迭代器模式

1.定义

迭代器模式依赖于一个迭代器接口,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

2.模式介绍

2.1.模式中的角色

  • 迭代器
    迭代器通常拥有一个接口,此接口中一般需要hasNext()、next()、remove()等方法,可以有任意个类实现此接口创建自己独特的迭代器。
  • 聚合
    聚合通常一样拥有一个接口,此接口中一般需要一个返回迭代器接口的方法createIterator(),任意一个类都可以实现接口并且实现其中的createIterator()方法来创建一个聚合类。

2.2.类图

这里写图片描述

3.测试代码

迭代器接口

/**
 * 迭代器接口
 */
public interface Iterator {
    boolean hasNext();

    Object next();

    void remove();
}

聚合接口

/**
 * 聚合接口
 */
public interface Aggregate {
    Iterator createIterator();
}

具体迭代器:

/**
 * 具体迭代器类,将传入的聚合对象封装成符合规范的迭代器
 */
public class ConcreteIterator implements Iterator {

    public List names;
    private int index = 0;

    public ConcreteIterator(List names) {
        if (names == null) {
            names = new ArrayList();
        }
        this.names = names;
    }

    @Override
    public boolean hasNext() {
        return (index < names.size()) && (names.get(index) != null);
    }

    @Override
    public Object next() {
        Object o = names.get(index);
        index++;
        return o;
    }

    @Override
    public void remove() {
        if (index <= 0) {
            return;
        }
        names.remove(names.get(index));
    }
}

具体聚合类

/**
 * 具体聚合类,管理聚合对象,通过createIterator将生成符合规范的的迭代器
 */
public class ConcreteAggregate implements Aggregate {

    List list = new ArrayList();

    public ConcreteAggregate() {
        addItem("张1");
        addItem("张2");
        addItem("张3");
        addItem("张4");
        addItem("张5");
        addItem("张6");
    }


    public void addItem(String name) {
        list.add(name);
    }

    @Override
    public Iterator createIterator() {
        return new ConcreteIterator(list);
    }
}

测试入口

public class InitMain {
    public static void main(String[] args) {
        /**
         * 迭代器模式依赖于一个迭代器接口
         * 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
         *
         * 设计原则
         * 单一责任原则:一个类应该只有一个引起变化的原因
         *  设计中我们要尽量避免类内部的改变,因为修改代码很容易造成许多潜在的错误。
         *  如果一个类具有两个改变的原因,就会使得将来该类的变化的几率上升。而这个原则告诉我们将一个责任只指派给一个类。
         */


        ConcreteAggregate aggregate = new ConcreteAggregate();

        Iterator iterator = aggregate.createIterator();

        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }


    }
}

4.单一责任原则

一个类应该只有一个引起变化的原因,设计中我们要尽量避免类内部的改变,因为修改代码很容易造成许多潜在的错误。如果一个类具有两个改变的原因,就会使得将来该类的变化的几率上升。而这个原则告诉我们将一个责任只指派给一个类。

5.总结

迭代器模式分离了集合的遍历行为,抽象出一个迭代器类,这样可以不暴露内部机构,又可让外部代码透明地访问集合内部的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值