你的位置:首页 > ASP.net教程

[ASP.net教程]IteratorPattern(迭代子模式)

/** * 迭代子模式 * @author TMAC-J * 聚合:某一类对象的集合 * 迭代:行为方式,用来处理聚合 * 是一种行为模式,用于将聚合本身和操作聚合的行为分离 * Java中的COLLECT就是一种聚合,Iterator类是一种迭代 * 好处:分开了行为和本身,便于行为的扩展和本身的维护,符合开闭原则 * 分为白盒(宽接口)和黑盒(窄接口) * 白盒:白盒提供了一些可以访问聚合内部的方法,如getSize,add,remove等等 * 黑盒:不提供或者提供很少外部访问的方法,对外部透明,就像一个黑盒,从外面看不到里面 * 一般而言聚合可以提供一些工厂方法或者抽象工厂来创建不同的迭代 * 下面的例子用黑盒来说明,因为我觉得黑盒相比于白盒来说分离的更开,耦合降为最低 */public class IteratorPattern {    abstract class Aggregate {         private Object[] objs;        public Aggregate(Object[] objs ) {      this.objs = objs;    }            /**     * 只提供Iterator的工厂方法,没有暴露其他方法给外部     */    abstract Iterator createIterator();     }       interface Iterator{        void add(Object obj);        void remove();        int getSize();      }    public class ConcreteAggregate extends Aggregate{        public ConcreteAggregate(Object[] objs) {      super(objs);          }    @Override    Iterator createIterator() {      return new ConcreteIterator(this);    }          }    public class ConcreteIterator implements Iterator{        private int size;//aggregate的大小        private int position;//指针(当时学的数据结构终于有用了.....)        private Aggregate aggregate;        public ConcreteIterator(Aggregate aggregate) {      this.aggregate = aggregate;    }        @Override    public synchronized void add(Object obj) {      if(position<size){        aggregate.objs[position] = obj;        position++;        size++;      }      else{        System.out.println("当前聚合已满!");//正常情况下这里要写一个日志类...但太麻烦了,就不写了      }    }    @Override    public synchronized void remove() {      if(position>0){        aggregate.objs[position-1] = null;        position--;        size--;      }      else{        System.out.println("当前聚合为空!");      }    }    @Override    public int getSize() {      if(aggregate!=null)return aggregate.objs.length;      return 0;    }      }    public void test(){    Object[] numbers = {1,2,3,4,5};    Aggregate aggregate = new ConcreteAggregate(numbers);    Iterator iterator = aggregate.createIterator();    iterator.add(1);    iterator.remove();    iterator.getSize();  }  }