本文出自 http://blog.csdn.net/shuangde800
走进迭代器模式
迭代器几乎是最常用的一种设计模式,在各面向对象语言中都有实现。
1. 迭代器首先需要一个迭代器的接口:
public interface Iterator {
boolean hasNext(); // 会返回一个布尔值,让我们知道是否还有更多的元素
Object next(); // next()方法会返回下一个元素
}
一旦我们有了这个接口,就可以为各种对象集合实现迭代器:数组,列表,散列表……
2. 封装一个数组的迭代器,并且假设这个数组是给某个餐厅的菜单服务:
public class DinerMenuIterator implements Iterator {
MenuItem[] items;
int position = 0;
public DinerMenuIterator(MenuItem[] items) {
this.items = items;
}
// next()方法返回数组内的下一项,并递增其位置
public Object next() {
MenuItem menuItem = items[position];
position = position + 1;
return menuItem;
}
// hasNext()方法会检查我们是否已经取得数组内的所有元素
public boolean hasNext() {
if (position >= items.length || items[position] == null) {
return false;
} else {
return true;
}
}
}
3. 把迭代器组合进菜单。
public class DinerMenu implements Menu {
static final int MAX_ITEMS = 6;
int numberOfItems = 0;
MenuItem[] menuItems;
public DinerMenu() {
menuItems = new MenuItem[MAX_ITEMS];
}
public void addItem(String name, String description,
boolean vegetarian, double price)
{
MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
if (numberOfItems >= MAX_ITEMS) {
System.err.println("Sorry, menu is full! Can't add item to menu");
} else {
menuItems[numberOfItems] = menuItem;
numberOfItems = numberOfItems + 1;
}
}
public MenuItem[] getMenuItems() {
return menuItems;
}
// 这个方法获取菜单的迭代器
public Iterator createIterator() {
return new DinerMenuIterator(menuItems);
}
// other menu methods here
}
5. 我们要打印出这个菜单的内容,只需要获取它的迭代器即可遍历出所有的菜单项,并且输出:
public class Waitress {
// 这个方法为每个菜单各自创建一个迭代器
public void printMenu() {
Iterator dinerIterator = dinerMenu.createIterator(); // 获取迭代器
printMenu(dinerIterator); // 调用printMenu遍历迭代器输出内容
}
private void printMenu(Iterator iterator) {
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem)iterator.next();
System.out.print(menuItem.getName() + ", ");
System.out.print(menuItem.getPrice() + " -- ");
System.out.println(menuItem.getDescription());
}
}
}
通过引入迭代器,菜单的实现已经被封装起来,Waitress类不知道菜单是如何存储菜单项集合的。
有了迭代器,我们只需要一个循环,就可以多态地处理任何项的集合。
而且Waitress类现在只使用一个接口(迭代器)
定义迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露出其内部的表示。
迭代器模式能够让我们游走于聚合内的没一个元素,而又不暴露其内部的表示
把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
设计原则:单一责任
一个类应该只有一个引起变化的原因
我们知道要避免类内的改变,因为修改代码很容易造成许多潜在的错误。如果一个类具有两个改变的原因,那么这会使得将来该类的变化几率上升,而当它真的改变时,你的设计中同时有两个方面将会受到影响
内聚:用来度量一个类或模板紧密地达到单一目的或责任。当一个模板或一个类设计只支持一组相关的功能时,我们说它具有高内聚;反之具有低内聚。
迭代器意味着没有次序。只是取出所有的元素,并不表示取出元素的先后就代表元素的大小次序。对于迭代器来说,数据结构可以是有次序的,也可以是没有次序的,甚至数据可以是重复。除非某些集合有特别说明,否则不对迭代器取出的元素大小次序作出假设
分享到:
相关推荐
迭代器模式是一种设计模式,它在软件开发中用于顺序访问聚合对象(如列表、集合等)的元素,而无需暴露其内部结构。这种模式允许在不同的聚合对象间使用相同的遍历逻辑,增强了代码的可复用性和灵活性。 在C#中,...
这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...
4. 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而不暴露其底层表示。 5. 中介者模式(Mediator):定义一个中介对象来简化原本复杂的对象间交互。 6. 备忘录模式(Memento):在不破坏封装性的...
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
2. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 3. 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。 4. 命令模式...
### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...
### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...
- **迭代器模式**(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **中介者模式**(Mediator):用一个中介对象来封装一系列的对象交互。 - **备忘录模式**(Memento...
15. 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 16. 访问者模式(Visitor):在不改变集合元素的前提下,为集合增加新的操作。 17. 命令模式(Command):将请求封装为...
这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...
- 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而不暴露其底层表示。 - 中介者模式(Mediator):定义一个中介对象来简化原本复杂的对象间交互。 - 备忘录模式(Memento):在不破坏封装性的...
文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...
迭代器模式是一种行为设计模式,它能顺序访问聚合对象的元素,而无需暴露其底层表示。迭代器模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。这样,客户端代码可以一致地遍历多种数据结构,而...
在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...
它们包括:责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、中介者(Mediator)、备忘录(Memento)、观察者(Observable/Observer)、状态(State)、策略(Strategy)、模板方法...
- **Iterator(迭代器模式)**:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **Mediator(中介者模式)**:用一个中介对象来封装一系列的对象交互。 - **Memento(备忘录模式)**...
3. 行为型模式:如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、责任链模式(Chain of Responsibility)、命令模式(Command...
- **行为型模式**:如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、命令(Command)、责任链(Chain of Responsibility)、备忘录(Memento)、...
6. **迭代器模式(Iterator)**:提供一种方法顺序访问一个聚合对象的元素,而又不暴露其底层表示。 7. **访问者模式(Visitor)**:在不改变类结构的前提下,增加新的操作功能。 8. **备忘录模式(Memento)**:在...