溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

設計模式之迭代器模式 引導篇

發(fā)布時間:2020-07-23 12:55:13 來源:網(wǎng)絡 閱讀:332 作者:凱哥Java 欄目:編程語言

迭代器模式-引導篇

設計模式之迭代器模式 引導篇

這兩天,比較火的并購新聞就是,網(wǎng)易考拉被阿里以20億美元收購。從此網(wǎng)易考拉不再姓“網(wǎng)”而姓“阿”了。并購后的網(wǎng)易考拉和阿里的電商系統(tǒng)進行對接。那么問題來了:在阿里有個早餐店的菜單(CakeHouseMenu)使用的事ArrayList來存放菜單的,考拉有個午餐店的菜單(DinerMenu)使用的是數(shù)組結構存放的。現(xiàn)在考拉和阿里合并了,兩個點的菜單也要合并。

設計模式之迭代器模式 引導篇

我們先來看看第一版設計:

因為馬爸爸說了,國慶之前,必須合并上線,時間緊任務中,腫么辦?那就再創(chuàng)建一個對象,使用一個菜單對象,將早餐店對象機午餐店對象作為屬性,調用的時候,直接調用各自對象的就可以。類圖如下:

設計模式之迭代器模式 引導篇

顧客來了,點早餐,服務器就從菜單中調用早餐店的get方法。得到KFC早餐套餐

如果點的是午餐,就從菜單中調用午餐店的getMenuItem方法,得到快餐一份。

代碼如下:

設計模式之迭代器模式 引導篇

運行ConventionalMainTest運行結果:

設計模式之迭代器模式 引導篇

我們可以看到,早餐、午餐菜單也都打印出來了。正常啊,沒問題啊。

我們先來看看服務員(waitress)對象里面內(nèi)容:

設計模式之迭代器模式 引導篇

從上圖中,我們可以看到在服務員對象中有早餐店對象、午餐店對象、list類型的items以及數(shù)組類型的items。從運行結果上來看,是沒有問題的。但是要是過了N+X天后,馬爸爸又玩起了收購腫么辦?假設收購的是X店。X店的菜單使用的是hashTable這種類型的。

難道,我們要在waitress中在添加X店對象同時添加hashTabel類型的items嗎?好,就算收購一個,添加一個可以。

那么如果收購了M+N個店。菜單數(shù)據(jù)類型使用了W種類型。難道,每次都修改waiters這個類嗎?

設計模式之迭代器模式 引導篇


這樣行是行,但是在后期維護、管理比較麻煩。而且還違背了開閉原則(對修改是封閉的,對擴展是開放的)。那么怎么辦呢?

來源:凱哥Java(kaigejava)。

凱哥個人博客:www.kaigejava.com

思考:

我們在開發(fā)的時候,針對接口開發(fā),這樣耦合度也可以降低。我們假設兩個飯店的菜單都實現(xiàn)了一個接口。然后waiter對象只要擁有接口對象就可以。

封裝遍歷的頂級接口,迭代器類圖如下:

設計模式之迭代器模式 引導篇

我們用迭代器接口來修改菜單:

設計模式之迭代器模式 引導篇

說明:

CakeHouseIterator和DinerIterator兩個類是實現(xiàn)了Iterator接口的

修改兩個飯店獲取getIterator的方法。返回對應放到實現(xiàn)iterator接口的對象。

我們來看早餐店的iterator對象:

設計模式之迭代器模式 引導篇

在重寫hasNext機next方法。

我們在來看看修改后的服務員對象:

設計模式之迭代器模式 引導篇

這個時候,服務員對象只有iterator對象了。已經(jīng)實現(xiàn)了對早餐店及午餐店的解耦。

再來看看測試類:

設計模式之迭代器模式 引導篇

在服務員對象添加菜單的時候,是不知道具體添加的是早餐店的菜單還是午餐店的菜單。實現(xiàn)了解耦。

這樣做的好處:

一:類之間實現(xiàn)了松耦合

二:就算考拉修改了菜單數(shù)據(jù)結構也不影響服務員的點餐。也是實現(xiàn)耦合的一種表現(xiàn)。

不寫了,太困了。已經(jīng)7號凌晨一點多了。各位看官,今日太累了,寫不不好,在迭代器總結篇好好補上。

本文作者:凱哥Java(kaigejava)





向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI