在电影唐伯虎点秋香中,华夫人为了为难唐伯虎,让秋香和华府都所有丫鬟都盖上红头巾,排排站,让唐伯虎在几米开外指认出秋香,唐伯虎每次指认一个人,华府都“保安头头”就会去掀起那位姑娘都头巾,确认是否为秋香。当然在电影中唐伯虎只有 3 次指认机会。
其实唐伯虎点秋香有点儿类似设计模式中的迭代器模式---提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。(有一点是在迭代器模式中没有被要求说只能迭代查找 3 次。)
下面用代卖来演示以下:
//定义一个迭代器都接口
public interface Iterator {
boolean hasNext();
Object next();
}
//容器都接口。
public interface Container {
void add(Object obj);
Iterator createIterator();//工厂模式创建新的迭代器。
}
//实现我们自己的迭代器。(保安头头)
public class MyIterator implements Iterator {
private List<Object> list;
private Integer index;
public MyIterator(List<Object> list) {
this.list = list;
index = 0;
}
public boolean hasNext() {
return index != list.size();
}
public Object next() {
if (hasNext()) {
return list.get(index++);
}
return null;
}
}
//实现自己的迭代器。
public class MyContainer implements Container {
private List<Object> list;
public MyContainer(List<Object> list) {
this.list = list;
}
public void add(Object obj) {
list.add(obj);
}
public Iterator createIterator() {
return new MyIterator(list);
}
}
public class IteratorTest {
@Test
public void iteratorTest() {
List<Object> list = new ArrayList<Object>();
list.add("石榴姐");
list.add("冬香");
Container container = new MyContainer(list);
container.add("秋香");
Iterator iterator = container.createIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
//石榴姐 冬香 秋香
}
}
上面代码中生成迭代器使用了工厂模式,简化了用户创建迭代器的过程。
接下来看看跌倒器模式的有缺点。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
Comments