zoukankan      html  css  js  c++  java
  • 设计模式之迭代器模式

    迭代器模式:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

    当需要访问一个聚集对象,而不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式。

    Iterator迭代器抽象类:

    public abstract class Iterator {
        public abstract Object first();
        public abstract Object next();
        public abstract boolean isDone();
        public abstract Object currentItem();
    }

    Aggregate聚集抽象类:

    public abstract class Aggregate {
        public abstract Iterator createIterator();
    }
    public class ConcreteAggregate extends Aggregate{
        private List<Object> items = new ArrayList<Object>();
    
        @Override
        public Iterator createIterator() {
            // TODO Auto-generated method stub
            return new ConcreteIterator(this);
        }
        public int count(){
            return this.items.size();
        }
        public Object getItemByIndex(int index){
            return items.get(index);
        }
        public List<Object> getItems() {
            return items;
        }
        public void setItems(List<Object> items) {
            this.items = items;
        }
    }
    public class ConcreteIterator extends Iterator{
        private ConcreteAggregate aggregate;
        private int current = 0;
        public ConcreteIterator(ConcreteAggregate aggregate){
            this.aggregate = aggregate;
        }
        @Override
        public Object first() {
            // TODO Auto-generated method stub
            return aggregate.getItemByIndex(0);
        }
        @Override
        public Object next() {
            // TODO Auto-generated method stub
            Object ret = null;
            current++;
            if(current < aggregate.count()){
                ret = aggregate.getItemByIndex(current);
            }
            return ret;
        }
        @Override
        public boolean isDone() {
            // TODO Auto-generated method stub
            return current >= aggregate.count() ? true : false;
        }
        @Override
        public Object currentItem() {
            // TODO Auto-generated method stub
            return aggregate.getItemByIndex(current);
        }
    
    }
    public class ConcreteIteratorDesc extends Iterator{
        private ConcreteAggregate aggregate;
        private int current = 0;
        public ConcreteIteratorDesc(ConcreteAggregate aggregate){
            this.aggregate = aggregate;
            current = this.aggregate.count() -1;
        }
        @Override
        public Object first() {
            // TODO Auto-generated method stub
            return aggregate.getItemByIndex(aggregate.count() -1);
        }
        @Override
        public Object next() {
            // TODO Auto-generated method stub
            Object ret = null;
            current--;
            if(current > 0){
                ret = aggregate.getItemByIndex(current);
            }
            return ret;
        }
        @Override
        public boolean isDone() {
            // TODO Auto-generated method stub
            return current < 0 ? true : false;
        }
        @Override
        public Object currentItem() {
            // TODO Auto-generated method stub
            return aggregate.getItemByIndex(current);
        }
    
    }
    public class Test {
        public static void main(String[] args){
            Object[] strArr = new Object[]{"xiaohei","xiaobai","xx","sfedd"};
            List<Object> passenger = Arrays.asList(strArr);
            ConcreteAggregate ca = new ConcreteAggregate();
            ca.setItems(passenger);
    //        Iterator iterator = ca.createIterator();
    //        Iterator iterator = new ConcreteIterator(ca);
            Iterator iterator = new ConcreteIteratorDesc(ca);
            while(!iterator.isDone()){
                System.out.println(iterator.currentItem() + "请买票");
                iterator.next();
            }
        }
    }

    迭代器模式就是分离了聚合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。

  • 相关阅读:
    Hardware Virtualization
    Windows Vista 中脱机文件的更改
    Vista右键打开方式有两个记事本。
    SQL Server 2008 无法采用SQL认证模式登录(已解决)
    .NET 书籍推荐
    快速掌握一个语言最常用的50% 孟岩
    [原创] 大内存妙用 之 Readyboost 篇
    .Net 中的反射 14
    pureMVC使用实践
    有关于movieClip的一些问题
  • 原文地址:https://www.cnblogs.com/shicaiyou/p/9353858.html
Copyright © 2011-2022 走看看