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