`
king_tt
  • 浏览: 2259696 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【设计模式】学习笔记12:迭代器模式(Iterator)

 
阅读更多



本文出自 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#学习笔记整理-迭代器模式介绍

    迭代器模式是一种设计模式,它在软件开发中用于顺序访问聚合对象(如列表、集合等)的元素,而无需暴露其内部结构。这种模式允许在不同的聚合对象间使用相同的遍历逻辑,增强了代码的可复用性和灵活性。 在C#中,...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    设计模式学习笔记

    4. 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而不暴露其底层表示。 5. 中介者模式(Mediator):定义一个中介对象来简化原本复杂的对象间交互。 6. 备忘录模式(Memento):在不破坏封装性的...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    300Java设计模式部分学习笔记

    2. 迭代器模式(Iterator Pattern):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 3. 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。 4. 命令模式...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **迭代器模式**(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **中介者模式**(Mediator):用一个中介对象来封装一系列的对象交互。 - **备忘录模式**(Memento...

    Java设计模式尚硅谷笔记

    15. 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 16. 访问者模式(Visitor):在不改变集合元素的前提下,为集合增加新的操作。 17. 命令模式(Command):将请求封装为...

    Java 版设计模式学习笔记-java-design-patterns.zip

    这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...

    23种设计模式的解析与Cpp实现

    - 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而不暴露其底层表示。 - 中介者模式(Mediator):定义一个中介对象来简化原本复杂的对象间交互。 - 备忘录模式(Memento):在不破坏封装性的...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    设计模式 笔记(附带代码)

    迭代器模式是一种行为设计模式,它能顺序访问聚合对象的元素,而无需暴露其底层表示。迭代器模式提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。这样,客户端代码可以一致地遍历多种数据结构,而...

    23个设计模式图解--学习笔记

    在《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...

    图解Java设计模式笔记总结word版本.rar

    - **行为型模式**:如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、命令(Command)、责任链(Chain of Responsibility)、备忘录(Memento)、...

    java23种设计模式,3套视频加1个ppt

    6. **迭代器模式(Iterator)**:提供一种方法顺序访问一个聚合对象的元素,而又不暴露其底层表示。 7. **访问者模式(Visitor)**:在不改变类结构的前提下,增加新的操作功能。 8. **备忘录模式(Memento)**:在...

Global site tag (gtag.js) - Google Analytics