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

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

有許多種方法能夠把對象堆起來成爲一個集合(collection)。你能夠把它們放進數組、堆棧、列表或是散列表中,這是你的自由。每一種都有它本身的優勢和適合的使用時機,但若是你想要遍歷這些對象,怎麼辦呢?不用擔憂,接下來的學習就是如何能讓客戶遍歷你的對象而又沒法窺視你存儲對象的方式;也將學習如何建立一些對象超集合,可以一口氣就跳過某些讓人望而生畏的數據結構。設計模式

對象村餐廳和對象村煎餅屋合併了

在面向對象的世界裏,小夥伴們都開心的不要不要的,由於如今他們能夠在同一個地方,享受煎餅屋美味的煎餅早餐,和好吃的餐廳午飯了。可是,有一點小麻煩......數組

煎餅屋記錄的菜單項是使用數組來存儲的,而餐廳是使用ArrayList記錄他的菜單項,兩家店長都不肯意改變如今的實現,畢竟有太多的代碼依賴了,而咱們又想減小依賴,用最小的改動。數據結構

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

想了解爲何有兩種不一樣的菜單表現方式會讓事情變得複雜化,讓咱們試着實現一個同時使用這兩個菜單的客戶代碼。學習

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

  • printMenu():打印出菜單上的每一項
  • printBreakfastMenu():值打印早餐項
  • printLunchMenu():只打印午飯項
  • printVegetarianMenu():打印全部的素食菜單項
  • isItemVegetarian(name):指定項的名稱,若是該項是素食的話,返回true,不然返回false

實現上來講,以下所示:code

  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();
}

看到這裏,能夠看到,咱們對遍歷的封裝已經奏效了;你大概已經猜到,這正是一個設計模式,稱爲迭代器模式。那咱們放在下次來具體說說,等着噢。ip

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

相關文章
相關標籤/搜索