属于行为型模式(共11种)
数据结构
物理结构上做存储的只有两种结构
连续存 array 用数组做存储
不连续 链表做存储 指针下一个数据
类图:
自定义的容器实现 一个自定义接口(collection)
接口中有 添加 删除 容器大小等方法
最重要的是 聚合自定义的 迭代器接口 并有一个迭代方法
自定义接口 可以通过 内部类的方式 实现迭代器接口 重写适用于自定义容易
遍历的 hasNext(); next();方法
部分代码举例
public interface Iterator_<E> { //Element //Type //K //Value V Tankboolean hasNext();E next(); //Tank next() Iterator_<Tank> it = ... Tank t = it.next();}
public interface Collection_<E> {void add(E o);int size();Iterator_ iterator();}
/*** 考虑边界问题*/class ArrayList_<E> implements Collection_<E> {E[] objects = (E[])new Object[10];//objects中下一个空的位置在哪儿,或者说,目前容器中有多少个元素private int index = 0;public void add(E o) {if(index == objects.length) {E[] newObjects = (E[])new Object[objects.length*2];System.arraycopy(objects, 0, newObjects, 0, objects.length);objects = newObjects;}objects[index] = o;index ++;}public int size() {return index;}@Overridepublic Iterator_<E> iterator() {return new ArrayListIterator();}private class ArrayListIterator<E> implements Iterator_<E> {private int currentIndex = 0;@Overridepublic boolean hasNext() {if(currentIndex >= index) return false;return true;}@Overridepublic E next() {E o = (E)objects[currentIndex];currentIndex ++;return o;}}}
public class Main {public static void main(String[] args) {Collection_<String> list = new ArrayList_<>();for(int i=0; i<15; i++) {list.add(new String("s" + i));}System.out.println(list.size());//这个接口的调用方式:Iterator_<String> it = list.iterator();while(it.hasNext()) {String o = it.next();System.out.println(o);}}}
链表指针实现
/*** 相比数组,这个容器不用考虑边界问题,可以动态扩展*/class LinkedList_ implements Collection_ {Node head = null;Node tail = null;//目前容器中有多少个元素private int size = 0;public void add(Object o) {Node n = new Node(o);n.next = null;if(head == null) {head = n;tail = n;}tail.next = n;tail = n;size++;}private class Node {private Object o;Node next;public Node(Object o) {this.o = o;}}public int size() {return size;}@Overridepublic Iterator_ iterator() {return null;}}
