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

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

很高興,這本書總共13章,這次已經是到第9章了;同時也很遺憾,小編脫離了書本,還是不知道如何描述一個設計模式。就比如迭代器與組合模式,原書篇幅比較長,小編儘量通俗易懂些,不到之處,還請各位小夥伴參考原書,小編也歡迎和大家一起交流。

有許多種方法可以把物件堆起來成為一個集合(collection)。你可以把它們放進陣列、堆疊、列表或是散列表中,這是你的自由。每一種都有它自己的優點和適合的使用時機,但如果你想要遍歷這些物件,怎麼辦呢?不用擔心,接下來的學習就是如何能讓客戶遍歷你的物件而又無法窺視你儲存物件的方式;也將學習如何建立一些物件超集合,能夠一口氣就跳過某些讓人望而生畏的資料結構。

物件村餐廳和物件村煎餅屋合併了

在面向物件的世界裡,小夥伴們都開心的不要不要的,因為現在他們可以在同一個地方,享受煎餅屋美味的煎餅早餐,和好吃的餐廳午餐了。但是,有一點小麻煩......

煎餅屋記錄的選單項是使用陣列來儲存的,而餐廳是使用ArrayList記錄他的選單項,兩家店長都不願意改變現在的實現,畢竟有太多的程式碼依賴了,而我們又想減少依賴,用最小的改動。

兩種表現形式會帶來什麼問題

想了解為什麼有兩種不同的選單表現方式會讓事情變得複雜化,讓我們試著實現一個同時使用這兩個選單的客戶程式碼。

我們新聘請了一位服務員,能應對顧客的需要列印定製的選單,甚至告訴你是否某個選單項是素食的,而無需詢問廚師。要求如下:

  • printMenu():打印出選單上的每一項
  • printBreakfastMenu():值列印早餐項
  • printLunchMenu():只打印午餐項
  • printVegetarianMenu():列印所有的素食選單項
  • isItemVegetarian(name):指定項的名稱,如果該項是素食的話,返回true,否則返回false

實現上來說,如下所示:

  1. 列印每份選單上的所有項,必須呼叫PancakeHouseMenu和DinerMenu的getMenuItem()方法,來取得它們各自的帶單項
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();

DinerMenu dinerMenu = new DinerMenu();
MenuItem[] lunchItems = dinerMenu.getMenuItems();
  1. 現在,分別列印裡面的具體專案,早餐使用ArrayList,午餐使用陣列
for (int i = 0; i < breakfastItems.size(); i++) {
    MenuItem menuItem = (MenuItem)breakfastItems.get(i);
    System.out.print(menuItem.getName());
    System.out.println("\t\t" + menuItem.getPrice());
    System.out.println("\t" + menuItem.getDescription());
}

for (int i = 0; i < lunchItems.length; i++) {
    MenuItem menuItem = lunchItems[i];
    System.out.print(menuItem.getName());
    System.out.println("\t\t" + menuItem.getPrice());
    System.out.println("\t" + menuItem.getDescription());
}
  1. 實現其他方法,做法也都和這一頁的方法相類似。我們總是需要處理兩個選單,並且用兩個迴圈遍歷這些項。如果還有第三家餐廳以不同的實現出現,我們就需要有三個迴圈。

下一步怎麼辦?

他們都不想改變自身的實現,因為意味著要重寫許多程式碼。所以,如果我們能夠找出一個方法,讓他們的選單實現一個相同的介面,這該多好呢。我們試試看封裝。

這本書給我們最大的改變,就是封裝變化的部分。在這裡發生的變化是:由不同的集合型別所造成的遍歷。能被封裝嗎?我們繼續來分析下:

  1. 要遍歷早餐項,我們需要使用ArrayList的size()和get()方法
for(int i = 0; i < breakfastItems.size(); i++) {
    MenuItem menuItem = (MenuItem)breakfastItems.get(i);
}
  1. 要遍歷午餐項,我們需要使用陣列的length欄位和中括號
for (int i = 0; i < lunchItems.length; i++) {
    MenuItem menuItem = lunchItems[i];
}
  1. 現在我們建立一個物件,我們把它稱為迭代器(Iterator),利用它來封裝“遍歷集合內的每個物件的過程”
Iterator iterator = breakfastMenu.createIterator();

while (iterator.hasNext()) {
    MenuItem menuItem = (MenuItem) iterator.next();
}
  1. 將它在陣列上試試:
Iterator iterator = lunchMenu.createIterator();
while (iterator.hasNext()) {
    MenuItem menuItem = (MenuItem) iterator.next();
}

看到這裡,可以看到,我們對遍歷的封裝已經奏效了;你大概已經猜到,這正是一個設計模式,稱為迭代器模式。那我們放在下次來具體說說,等著噢。

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

相關推薦

設計模式組合模式

很高興,這本書總共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

C++標準模板庫 iterator 詳解

[cpp] view plaincopyprint? #include <vector> #include <iostream> #include <list> #include <

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

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

研磨設計模式業務場景

場景描述 專案客戶方收購了一家小公司,這家小公司有自己的工資系統,客戶方的工資系統內部採用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