很高興,這本書總共13章,此次已是到第9章了;同時也很遺憾,小編脫離了書本,仍是不知道如何描述一個設計模式。就好比迭代器與組合模式,原書篇幅比較長,小編儘可能通俗易懂些,不到之處,還請各位小夥伴參考原書,小編也歡迎和你們一塊兒交流。設計模式
有許多種方法能夠把對象堆起來成爲一個集合(collection)。你能夠把它們放進數組、堆棧、列表或是散列表中,這是你的自由。每一種都有它本身的優勢和適合的使用時機,但若是你想要遍歷這些對象,怎麼辦呢?不用擔憂,接下來的學習就是如何能讓客戶遍歷你的對象而又沒法窺視你存儲對象的方式;也將學習如何建立一些對象超集合,可以一口氣就跳過某些讓人望而生畏的數據結構。數組
在面向對象的世界裏,小夥伴們都開心的不要不要的,由於如今他們能夠在同一個地方,享受煎餅屋美味的煎餅早餐,和好吃的餐廳午飯了。可是,有一點小麻煩......數據結構
煎餅屋記錄的菜單項是使用數組來存儲的,而餐廳是使用ArrayList記錄他的菜單項,兩家店長都不肯意改變如今的實現,畢竟有太多的代碼依賴了,而咱們又想減小依賴,用最小的改動。學習
想了解爲何有兩種不一樣的菜單表現方式會讓事情變得複雜化,讓咱們試着實現一個同時使用這兩個菜單的客戶代碼。spa
咱們新聘請了一位服務員,能應對顧客的須要打印定製的菜單,甚至告訴你是否某個菜單項是素食的,而無需詢問廚師。要求以下:設計
實現上來講,以下所示:code
PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();
DinerMenu dinerMenu = new DinerMenu();
MenuItem[] lunchItems = dinerMenu.getMenuItems();
複製代碼
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());
}
複製代碼
他們都不想改變自身的實現,由於意味着要重寫許多代碼。因此,若是咱們可以找出一個方法,讓他們的菜單實現一個相同的接口,這該多好呢。咱們試試看封裝。cdn
這本書給咱們最大的改變,就是封裝變化的部分。在這裏發生的變化是:由不一樣的集合類型所形成的遍歷。能被封裝嗎?咱們繼續來分析下:對象
for(int i = 0; i < breakfastItems.size(); i++) {
MenuItem menuItem = (MenuItem)breakfastItems.get(i);
}
複製代碼
for (int i = 0; i < lunchItems.length; i++) {
MenuItem menuItem = lunchItems[i];
}
複製代碼
Iterator iterator = breakfastMenu.createIterator();
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem) iterator.next();
}
複製代碼
Iterator iterator = lunchMenu.createIterator();
while (iterator.hasNext()) {
MenuItem menuItem = (MenuItem) iterator.next();
}
複製代碼
看到這裏,能夠看到,咱們對遍歷的封裝已經奏效了;你大概已經猜到,這正是一個設計模式,稱爲迭代器模式。那咱們放在下次來具體說說,等着噢。接口