閱讀472 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《數據結構與抽象:Java語言描述(原書第4版)》一1.3 使用ADT包

本節書摘來華章計算機《數據結構與抽象:Java語言描述(原書第4版)》一書中的第1章 ,第1.3節,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學  新英格蘭理工學院 辛運幃 饒一梅 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。

1.3 使用ADT包

假定我們雇用一名程序員使用Java實現ADT包,給定到目前為止已有的接口和規格說明。如果假定這些規格說明已經足夠清楚能讓程序員完成相關的實現,那麼我們可以在程序中使用這些ADT操作而不需要知道實現的細節。即,我們不需要知道程序員如何實現這個包,也能使用這個包。我們隻需知道ADT包做什麼就可以了。本節假定已經有了一個Java類Bag,它實現了程序清單1-1給出的Java接口BagInterface。簡單的例子說明我們如何使用Bag。
在程序清單1-2的第13行,注意一旦我們選擇了包中對象的數據類型(本例中是Item),這個數據類型就包含在接口名後麵的尖括號中。還要注意類名後麵的空尖括號。包中的所有項必須是這個數據類型或這個數據類型的子類型。編譯程序強製我們遵守這條約定。如果是基本數據類型,則可以將對應的包裝類的實例放入包中。例如,不是使用基本數據類型int的實例,而是使用包裝類Integer的實例。

示例:在線購物。當在線購物時,你挑選的商品保存在購物車或購物袋內,直到你準備去結賬為止。實現購物網站的程序可以使用類Bag來維護購物車。畢竟,你挑選的購買物品的次序是不重要的。程序清單1-2顯示這樣一個程序的簡單示例。

程序清單1-2 在線購物中購物袋的維護程序
image
image

為使示例簡單,我們創建Item對象的數組來表示購物者挑選的商品。類Item可在本書的在線資源中找到,它定義了用來描述商品及價格的數據域,還定義了這些域的訪問方法及toString方法。
初始時,我們使用Bag的默認構造方法創建Item對象的空包。注意,shoppingCart的數據類型是BagInterface。這個聲明要求shoppingCart僅能調用聲明在BagInterface中的方法。另外,我們可以用實現BagInterface的其他類來替換Bag,而不需要修改程序中後續的語句。
注意將挑選的商品添加到包中的循環,及結賬時一次刪除它們中的一個的循環。

自測題7 在前麵的例子中,在結賬過程中執行while循環,直到包是空的時為止。可用什麼樣的for語句來替換這個while語句?隻根據shoppingCart的存在與否來寫,而不是數組items。
示例:撲滿。你或許有一個撲滿、存錢罐,或者其他某個容器來存放你剩下的硬幣。撲滿裝硬幣,但並不組織它們。而撲滿中肯定有重複的硬幣。撲滿好像一個包,但更簡單,因為它僅有3個操作:可以將一個硬幣添加到撲滿中、刪除一個(搖晃撲滿,所以沒辦法控製哪個硬幣掉下來),或者看看撲滿是否為空。

假定你有表示硬幣的類Coin,我們可以創建程序清單1-3中給出的類PiggyBank。PiggyBank對象將硬幣保存在包中,即,保存在實現了接口BagInterface的類的實例中。PiggyBank的add、remove和isEmpty方法分別調用包方法來得到各自的結果。類PiggyBank是適配器類的一個示例。關於適配器類詳見附錄D。
程序清單1-3 撲滿的類
image
image

程序清單1-4提供了類PiggyBank的主要示例。程序將一些硬幣添加到撲滿中,然後再刪除所有的硬幣。因為程序沒有記錄添加到撲滿中的硬幣,所以沒辦法控製刪除哪個硬幣。雖然輸出的內容表示從撲滿中拿走硬幣的次序與它們放入撲滿中的次序相反,但這個次序依賴於包的實現。我們在下一章將考慮這些實現。
注意,除了main方法外,程序定義了另一個方法addCoin。因為main是靜態的且調用addCoin,所以addCoin也必須是靜態的。方法addCoin接收的參數是一個Coin對象和一個PiggyBank對象。然後該方法將硬幣添加到撲滿中。
程序清單1-4 類PiggyBank的示例
image
image

注:方法可以改變作為參數傳給它的對象的狀態

將兩個參數傳給方法addCoin:一個硬幣和一個撲滿。這兩個參數都是main方法中已存在的對象的引用。方法addCoin保存參數中這些引用的副本,你應該記得,它們的行為像局部變量。雖然addCoin不能改變引用,但因為它們已存在於main方法中,所以它能改變所指對象的狀態。具體來說,它能通過向撲滿中添加硬幣來修改撲滿(即PiggyBank對象)。記住,這個撲滿隻局部於main,且在addCoin的外麵。

注:一旦在下一章實現了包類,你就能實際運行前一個程序清單中給出的程序。你隻需要將類名Bag替換為下一章中的示例使用的一個類名即可。

自測題8 考慮程序清單1-4中的程序。在創建類PiggyBank的實例myBank後,假定將幾個未知硬幣添加到myBank中。寫代碼,從撲滿中刪除硬幣,直到或者刪除一分錢硬幣,或者撲滿為空時為止。

最後更新:2017-06-26 15:33:35

  上一篇:go  《數據結構與抽象:Java語言描述(原書第4版)》一1.4 像使用自動販賣機一樣使用ADT
  下一篇:go  Docker CE 鏡像源站