1. 程式人生 > >設計模式之迭代器與組合模式(二)

設計模式之迭代器與組合模式(二)

在上次的文章中,我們通過層層引導,已經知道了迭代器模式的由來。現在我們再好好總結下。

關於迭代器模式,你所需要知道的第一件事情,就是它依賴於一個名為迭代器的介面。這是一個可能的迭代器的介面:

現在,我們一旦有了這個介面,就可以為各種物件集合實現迭代器:陣列、列表、散列表...如果我麼想要為陣列實現迭代器,以便使用在DinerMenu中,看起來就像這樣:

在餐廳選單中加入一個迭代器

想要在餐廳選單中加入一個迭代器,我們需要先定義迭代器介面:

public interface Iterator {
    boolean hasNext();
    Object next();
}

現在我們需要實現一個具體的迭代器,為餐廳選單服務:

public class DinerMenuIterator implements Iterator {
    MenuItem[] items;
    int position = 0;
 
    public DinerMenuIterator(MenuItem[] items) {
        this.items = items;
    }
 
    public MenuItem next() {
        MenuItem menuItem = items[position];
        position = position + 1;
        return menuItem;
    }
 
    public boolean hasNext() {
        if (position >= items.length || items[position] == null) {
            return false;
        } else {
            return true;
        }
    }
}

接下來,我們改寫下餐廳選單:

public Iterator createIterator() {
    return new DinerMenuIterator(menuItems);
    // To test Alternating menu items, comment out above line,
    // and uncomment the line below.
    //return new AlternatingDinerMenuIterator(menuItems);
}

我們需要將迭代器程式碼整合進服務員中。我們應該擺脫原本冗餘的部分。整合的做法相當直接:首先建立一個printMenu()方法,傳入一個迭代器當做此方法的引數,然後對每一個選單都是用createIterator()方法來檢索迭代器,並將迭代器傳入新方法。

public class Waitress {
    Menu pancakeHouseMenu;
    Menu dinerMenu;
 
    public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
        this.pancakeHouseMenu = pancakeHouseMenu;
        this.dinerMenu = dinerMenu;
    }
 
    public void printMenu() {
        Iterator pancakeIterator = pancakeHouseMenu.createIterator();
        Iterator dinerIterator = dinerMenu.createIterator();

        System.out.println("MENU\n----\nBREAKFAST");
        printMenu(pancakeIterator);
        System.out.println("\nLUNCH");
        printMenu(dinerIterator);

    }
 
    private void printMenu(Iterator iterator) {
        while (iterator.hasNext()) {
            MenuItem menuItem = iterator.next();
            System.out.print(menuItem.getName() + ", ");
            System.out.print(menuItem.getPrice() + " -- ");
            System.out.println(menuItem.getDescription());
        }
    }
    // 此處省略其他方法
}

熟悉Java的同學應該知道,其實Java有自帶的迭代器介面。但是,我在這裡為什麼不這麼做呢,是為了讓我們更好地瞭解如何從頭建立一個迭代器。現在目的達到了,所以就要改變做法,把之前自定義的迭代器改成Java的Iterator介面即可,在這裡就不進行具體描述啦,詳情請看原始碼即可。

定義迭代器模式

現在我們已經知道了如何用自己的迭代器來實現迭代器模式,也看到了Java是如何在某些面向聚合的類中(入ArrayList)支援迭代器的。現在我們就來看看這個模式真的正式定義:

迭代器模式提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內容的表示。

這個模式給你提供了一種方法,可以順序訪問一個聚集物件中的元素,而又不用知道內部是如何表示的。在設計中使用迭代器的影響是明顯的:如果你有一個統一的方法訪問聚合中的每一個物件,你就可以編寫多型的程式碼和這些聚合搭配,使用--如同前面的printMenu()方法一樣,只要有了迭代器這個方法根本不管選單項究竟是有由陣列還是ArrayList來儲存的。

另一個對你設計造成重要影響的,是迭代器模式把元素之間遊走的責任交給迭代器,而不是聚合物件。這不僅讓聚合的介面和實現變得更簡潔,也可以讓聚合更專注在它所應該專注的事情上面,而不必去理會遍歷的事情。

讓我們檢查類圖,將來龍去脈拼湊出來

至此,迭代器模式我們就差不多都瞭解啦。但是,接下來,我們還會介紹組合模式,它為什麼要和迭代器模式放在同一個章節裡面呢?我們下回分曉。

愛生活,愛學習,愛感悟,愛挨踢

相關推薦

設計模式組合模式

很高興,這本書總共13章,這次已經是到第9章了;同時也很遺憾,小編脫離了書本,還是不知道如何描述一個設計模式。就比如迭代器與組合模式,原書篇幅比較長,小編儘量通俗易懂些,不到之處,還請各位小夥伴參考原書,小編也歡迎和大家一起交流。 有許多種方法可以把物件堆起來成為一個集合(collection)。你可以把它們

設計模式組合模式

在上次的文章中,我們通過層層引導,已經知道了迭代器模式的由來。現在我們再好好總結下。 關於迭代器模式,你所需要知道的第一件事情,就是它依賴於一個名為迭代器的介面。這是一個可能的迭代器的介面: 現在,我們一旦有了這個介面,就可以為各種物件集合實現迭代器:陣列、列表、散列表...如果我麼想要為陣列實現迭代器,

設計模式組合模式

現在我們已經能愉快地看著一頁一頁羅列出來的選單進行點菜了。現在又有的小夥伴希望能夠加上一份餐後甜點的“子選單”。怎麼辦呢?我們不僅僅要支援多個選單,甚至還要支援選單中的選單。 如果我們能讓甜點選單變成餐廳選單集合的一個元素,那該有多好。但是根據現在的實現,根本做不到呀。我們想要的是這樣的: 我們需要什麼

設計模式組合模式

因為這系列篇幅較長,所以在這裡也不進行任何鋪墊,直奔主題去啦。 利用組合設計選單 我們要如何在選單上應用組合模式呢?一開始,我們需要建立一個元件介面來作為選單和選單項的共同介面,讓我們能夠用統一的做法來處理選單和選單項。換句話說,我們可以針對選單或選單項呼叫相同的方法。 讓我們從頭來看看如何讓選單能夠符合組合

設計模式組合模式(java)

這是我看Head first設計模式書籍之後想要總結的知識點,一方面是對自己學習的東西總結和提煉加強自己的理解和記憶,另一方面是給大家簡化這本書,方便大家快速瞭解各種設計模式。 我想提醒大家的是,設計模式只是前人總結的一些經驗套路,實際上還是要在開發專案中慢慢體會,不可成為

HeadFirst 設計模式 9組合模式餐廳合併

迭代器模式 提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 迭代器模式讓我們能夠遊走於聚合內的每個元素,而又不暴露其內部的表示。把遊走的任務放在迭代器上,而不是聚合上。這樣簡化了聚合的介面和實現,也讓責任各得其所。 集合collection/聚合ag

設計模式組合模式

迭代器與組合模式 定義  迭代器模式提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 組合模式允許你將物件組合成樹形結構來表現“整體/部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及物件組合 例子  廢話不多說,先看具體案例

走進設計模式的世界9:我們的公司很複雜-組合模式

迭代器模式 : 提供一個方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部表示。 組合模式 : 允許你將物件組成樹形結構來表現“整體/部分”的層次結構。組合能讓可以以一致的方式處理個別對象和物件組合。 設計原則:類應該只有一個改變的理由 解釋 : 迭代器允許訪問聚合的元素

組合模式轉載

程式碼實在太多了,偷個懶轉載大佬的 https://www.cnblogs.com/lzhp/p/3427704.html 迭代器模式 提供了一種方法順序訪問一個聚合物件中的各個元素,而又不暴露內部的表示 把在元素之間遍歷的責任交給迭代器,而不是聚合物件 角色

9.組合模式

Head-First-Design-Patterns-master\src\headfirst\designpatterns\iterator Head-First-Design-Patterns-master\src\headfirst\designpatterns\co

設計模式的藝術 行為型模式模式

前言 現在的電視機都配置了一個遙控器,使用者可以通過遙控器去選擇上一個或者下一個臺,我們只需要知道如何使用這個遙控器,而無須關注電視是怎麼把電視訊道放入其中的,在軟體實際的開發中,也有這麼一種類,它儲存著多個成員物件,這些類通常稱為聚合類,對應的物件稱為聚合物件。為了方便操作這些聚合物件,同時可

研磨設計模式業務場景

場景描述 專案客戶方收購了一家小公司,這家小公司有自己的工資系統,客戶方的工資系統內部採用List來記錄工資列表,新收購的小公司的工資系統內部採用陣列來記錄工資列表,整合兩個系統的工資表資料 已有系統程式碼示例 一個統一了的工資描述模型 /**

研磨設計模式

聚合 指一組物件的組合結構,如Java中的集合、陣列等 迭代器模式 提供一種方法,順序訪問一個聚合物件中的各個元素,而又不需要暴露該物件的內部表示 目標 以一個統一的方式來訪問內部實現不同的聚合物件 示例程式碼

設計模式模式Iterator

前言: 參考圖書:軟體設計模式與體系結構 參考部落格:https://www.cnblogs.com/wanson/articles/9277813.html   正題:         迭代器(iterator)有時又稱遊標

golang設計模式模式

迭代器模式 定義 wiki: 在 物件導向程式設計裡,迭代器模式是一種設計模式,是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每一個元素而不用瞭解底層的實作。 簡單點說,為一個容器設定一個迭代函式,可以使用這個迭代函式來順序訪問其中的每一個元素,而外部無需知道底層實現

java設計模式

本文介紹行為型模式的一種模式——迭代器模式。該模式主要用於對某一物件集合進行遍歷,將物件的資料儲存和遍歷進行分離。在Java語言中有著較高的應用頻率。 1、定義:提供一種方法順序地訪問一個聚合物件中的各個元素而不需要暴露該物件的內部表示。 2、模式結構: (1)Iter

23種設計模式模式

迭代器模式的定義 定義: 它提供一種方法訪問一個容器物件中各個元素, 而又不需暴露該物件的內部細節 其類圖如下:   其中角色: Iterator 抽象迭代器: 抽象迭代器負責定義訪問和遍歷元素的介面, 而且基本上是有固定的三個方法: first()獲得第一個元素, n

Android設計模式模式

迭代器模式又稱遊標模式, 是行為型設計模式之一。迭代器模式源於對容器的訪問,比如Java中的List、Map、陣列等。 對容器物件的訪問必然會涉及到遍歷演算法,可以將遍歷演算法封裝在容器中,或者不提供遍歷演算法。如果將遍歷演算法封裝在容器中,那麼容器類就承擔了過多的功能,容器類不僅要維護自身內部

Python進階:設計模式模式

  在軟體開發領域中,人們經常會用到這一個概念——“設計模式”(design pattern),它是一種針對軟體設計的共性問題而提出的解決方案。在一本聖經級的書籍《設計模式:可複用面向物件軟體的基礎》(1991年,Design Patterns - Elements of Reusable Obj

設計模式模式Iterator Pattern

這篇部落格,我們要詳細講解的是迭代器模式(Iterator Pattern),將要講解的內容有:迭代器模式 的定義,作用,詳細設計分析等方面。 一、Pattern name 迭代器模式(Iterator Pattern) : 提供一種方法