/** * 迭代子模式 * @author TMAC-J * 聚合:某一類對象的集合 * 迭代:行為方式,用來處理聚合 * 是一種行為模式,用於將聚合本身和操作聚合的行為分離 * Java中的COLLECT就是一種聚合,Iterator類是一種迭代 * 好處:分開了行為和本身,便於行為的擴展和本身的... ...
/** * 迭代子模式 * @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(); } }