解析语句中的动作标记。 将标记规约为动作。 执行动作。
这种模式一般会应用到一些特殊的问题上,使用这种模式一般需要了解形式语言中的基本知识。js内核就是一个强大的解释器。解释器模式举例
简单的解释器模式,我们需要解释出来表达式的信息即可;而更深一层的,我们需要把表达式中的内容,翻译成我们程序运行的一部分来执行。
9、迭代器模式
别名:游标(Another Name:Cursor)
提供一种方法顺序访问一个聚合对象中的各个元素,而由不需要暴露该对象的内部细节。
何时使用
让用户访问集合汇总的对象而不想暴露这个集合的实现时 对不同集合提供一个统一的遍历接口时
优点
用户使用迭代器访问集合中的对象而不需要知道这个集合的具体实现 可以同时使用多个迭代器遍历一个集合
通常容器提供的迭代器时可以高速遍历它本身的,而使用其本身的机制(如LinkedList中使用get(i)方法遍历)遍历性能可能并不好。
其实这个在工厂方法模式给出的例子就足够解释这个模式的使用了,如需看具体代码实现,请移步工厂方法模式中的例子查看。
其中主要的角色是集合、具体集合、迭代器、具体迭代器。
迭代器其实很简单,下面我们就继续工厂方法模式中的例子,将它完善一下:
稍微增强的集合接口:
//集合接口public intece MyList<T> { MyIterator<T> iterator(); //返回一个遍历器 boolean add(T t); //添加元素到列表 T get(int index); //得到元素 T remove(); //删除最后一个元素 boolean remove(T element); //删除指定元素 T remove(int index); //删除指定位置元素 boolean set(int index,T element); //修改指定位置 int size();}
容量可以自动增长的数组实现的集合:
public class MyArrayList<T> implements MyList<T>{ private int size; //存放的元素个数,会默认初始化为0 private Object[] defaultList; //使用数组存放元素 private static final int defaultLength = 10;//默认长度 public MyArrayList(){ //默认构造函数 defaultList = new Object[defaultLength]; } @Override public MyIterator<T> iterator() { return new Iterator(); } //大小自动增长 private void ensureCapacity(int capacity){ int nowLength = defaultList.length; if(capacity >= nowLength){ nowLength = nowLength (nowLength>>1); if(nowLength<0)//溢出 nowLength = Integer.MAX_VALUE; defaultList = Arrays.copyOf(defaultList, nowLength); } } //添加元素 @Override public boolean add(T t) { ensureCapacity(size1); defaultList[size] = t; return true; } //获取元素 @SuppressWarnings("unchecked") @Override public T get(int index) { if(index<0 || index>=size) return null; return (T) defaultList[index]; } @Override public T remove() { return remove(size-1); } @SuppressWarnings("unchecked") @Override public T remove(int index) { if(index<0||index>=size) return null; T element = (T) defaultList[index]; if(index != size-1) System.arraycopy(defaultList, index1, defaultList, index,size-index-1); size--; return element; } @Override public boolean remove(T element) { if(element==null){ for(int i = 0 ; i<size;i) if(defaultList[i]==null){ System.arraycopy(defaultList, i1, defaultList, i,size-i-1); size--; return true; } } else{ for(int i = 0 ; i<size;i) if(defaultList[i].equals(element)){ System.arraycopy(defaultList, i1, defaultList, i,size-i-1); size--; return true; } } return false; } @Override public boolean set(int index,T element) { if(index<0||index>=size) return false; defaultList[index] = element; return true; } @Override public int size() { return size; } //迭代器 private class Iterator implements MyIterator<T>{ private int next; @Override public boolean hasNext() { return next<size; } @SuppressWarnings("unchecked") @Override public T next() { return (T) defaultList[next]; } @Override public T remove() { // TODO Auto-generated method stub return null; } }}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-16.html
他不会因为南海而丢了中东和欧洲
你的阿里巴巴就是死的那一天