1.迭代器模式完成的功能是和迭代器一样的,封装了对对象的顺序遍历,因为子类的对象集合的存储方式可能并不一致。但是存储的对象是一致的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public classItem{ .....//各种属性 } public class Set1{ item[] items; ... public Iterator createIterator(){ return new ItemIterator(items); } } public class Set2{ ArrayList items; ... public Iterator createIterator(){ return items.iterator(); } } public class ItemIterator implements Iterator{ Item[] items; int position; public ItemIterator(Item[] items) { this.items=items; position=0; } public Object next() { Item i=items[position]; position=position+1; return i; } public boolean hasNext() { if (position>=items.lenght || items[position]==null) return false; else return true; } }
通过这种方法,我们就可以通过自己定义的一个迭代器来访问数组,同时通过createIterator的方法来顺序遍历存储结构不一样的Set1和Set2中item对象。所以迭代器模式就是:
1 迭代器模式:提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露其内部的表示。
2.组合模式
组合模式其实就是整体与部分的一个关系,其实就是一个树形结构,根节点由他的子节点组合而成,而子节点又有自己的子节点来组合而成,所以组合模式的定义如下:
1 组合模式:允许你将对象组合成树形结构来表现“整体/部分”的层次结构,组合能让客户以一致的方法处理个别对象以及对象组合。
现在我们需要对组合模式下的对象这棵进行遍历怎么办?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public abstract class ItemComponent{ ....//方法 public void method1(){ } } public classItem extends ItemComponent{ .....//各种属性 public void method1() { System.out.println("leaf"); } } public class Set1 extends ItemComponent{ item[] items; ... public Iterator Iterator(){ return new ItemIterator(items); } public void method1() { System.out.println("not leaf"); Iterator iterator=itemComponent.iterator();//重写 while (iterator.hasNext()) { ItemComponent t=(ItemComponent) iterator.next(); t.method1(); } } } public class Set2 extends ItemComponent{ ArrayList items; ... public Iterator Iterator(){ return items.iterator(); } public void method1() { System.out.println("not leaf"); Iterator iterator=itemComponent.iterator();//重写 while (iterator.hasNext()) { ItemComponent t=(ItemComponent) iterator.next(); t.method1(); } } }
上面这种方式是一种通过递归的方式来实现全部遍历的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public class ItemIterator implements Iterator{ stack stack = new Stack(); public ItemIterator(Iterator iter) { stack.push(iter); } public Object next() { if (hasNext()){ Iterator iterator=(Iterator)stack.peek(); ItemComponent t=(ItemComponent) iterator.next(); if (t instanceof Set1) { stack.push(t.createIterator()); } return t; }else{ return null; } } public boolean hasNext() { if (stack.empty()){ return false; }else{ Iterator iterator=(Iterator) stack.peek(); if (!iterator.hasNext()){ stack.pop(); return hasNext(); }else { return true; } } } }
现在定义的这种方式,是通过迭代器用栈模拟递归的一种方式。
3。设计模式-职责单一