15、設計模式(行為型)之迭代器模式
阿新 • • 發佈:2018-12-12
作用
- 提供一種方法順序訪問一個聚合物件中各個元素, 而又無須暴露該物件的內部表示。
何時使用
- 遍歷一個聚合物件。
優點
- 它支援以不同的方式遍歷一個聚合物件。
- 迭代器簡化了聚合類。
- 在同一個聚合上可以有多個遍歷。
- 在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有程式碼。
例項
/** * @Author: create_By: chenxin * @Data:Created in 2018/9/5 17:53 * @Version: * @Acton: 自己造迭代器 */ public interface MyIterator { void first(); //第一個元素 void next(); //下一個元素 boolean hasNext(); //下一個元素 boolean isFirst(); //是否第一個元素 boolean isLast(); //是否最後一個元素 Object getCurrentObj(); //獲取當前元素 }
/** * @Author: create_By: chenxin * @Data:Created in 2018/9/5 18:00 * @Version: * @Acton: 聚合類 */ public class Converge { private List<Object> list = new ArrayList<>(); public void addObject(Object obj){ this.list.add(obj); } public void removeObject(Object obj){ this.list.remove(obj); } public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } //獲取迭代器 public MyIterator createIterator(){ return new ConvergeIterator(); } //使用內部類定義迭代器,可以直接使用外部類的屬性 private class ConvergeIterator implements MyIterator { private int cursor; //定義遊標,用於建立時的位置 @Override public void first() { cursor = 0; } @Override public void next() { if (cursor < list.size()){ cursor++; } } @Override public boolean hasNext() { if(cursor < list.size()){ return true; } return false; } @Override public boolean isFirst() { return cursor == 0 ? true:false; } @Override public boolean isLast() { return cursor == (list.size() - 1) ? true:false; } @Override public Object getCurrentObj() { return list.get(cursor); } } }
/** * @Author: create_By: chenxin * @Data:Created in 2018/9/5 18:48 * @Version: * @Acton: */ public class TestIteratorDemo { public static void main(String[] args){ test(); } public static void test(){ Converge converge = new Converge(); converge.addObject("衛莊"); converge.addObject("白鳳"); converge.addObject("紅蓮"); MyIterator iterator = converge.createIterator(); while (iterator.hasNext()){ System.out.println(iterator.getCurrentObj()); iterator.next(); } } }