《數據結構與抽象:Java語言描述(原書第4版)》一1.4 像使用自動販賣機一樣使用ADT
本節書摘來華章計算機《數據結構與抽象:Java語言描述(原書第4版)》一書中的第1章 ,第1.4節,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學 新英格蘭理工學院 辛運幃 饒一梅 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。
1.4 像使用自動販賣機一樣使用ADT
假定你站在一台自動販賣機前,如圖1-3所顯示,或者更高級的一台,休息一下,然後從販賣機中買些東西!
當站在自動販賣機前時,會看到它的界麵。投入硬幣並且按下按鈕,就能購物了。下麵是對自動販賣機的觀察結果:
- 你僅能執行機器的界麵提供給你的特定任務。
- 你必須理解這些任務——即你必須知道買一瓶汽水應該怎麼辦。
- 你不能訪問機器內部,因為鎖著的外殼封裝了它。
- 即使你不知道內部將發生什麼,但你可以使用機器。
- 如果有人用改進版替換了機器內部的機製但沒改變界麵,你仍然能用同樣的方式使用機器。 與自動販賣機的用戶一樣,你就像本章前麵見過的ADT包的客戶。剛剛說的對自動販賣機用戶的觀察,類似於對包的客戶的觀察:
- 客戶僅能執行ADT包說明的操作。這些操作常常聲明在一個Java接口中。
- 客戶必須遵守ADT包提供的操作規範。即客戶的程序員必須理解如何使用這些操作。
- 客戶不使用ADT操作就不能訪問包中的數據。封裝原理將數據表示隱藏在ADT的內部。 客戶可以使用包,即使程序員不知道數據是如何存儲的。
- 如果有人改變了包操作的實現,隻要界麵沒有改變,客戶仍然能用同樣的方式使用包。
在前一節的示例中,每個包都是實現ADT包的類的一個實例。即,每個包是一個對象,它的行為是ADT包的操作。你可以把每個這樣的對象看作我們剛描述的自動販賣機。每個對象封裝了包的數據和操作,就像自動販賣機封裝了它的產品(汽水)和輸送係統一樣。
有些ADT操作有輸入,類似於你投入自動販賣機中的硬幣。有些ADT操作有輸出,類似於自動販賣機提供的找零、汽水、消息及提示燈。
現在假定你是自動販賣機麵板或界麵的設計人員。機器能做什麼?在使用機器時人應該做什麼?考慮在機器內如何保存及輸送汽水瓶,對你是否有幫助?我們強調,你應該忽略這些方麵,而把注意力完全集中於人如何使用機器上——即你要關注界麵的設計。忽略無關細節能使你的任務更簡單,並提高設計質量。
我們記得,作為設計原則,抽象要求你關注於什麼而不是如何。當你設計一個ADT並最終設計一個類時,使用數據抽象將關注焦點集中在你想對數據做什麼,而不必擔心如何完成這些任務。本章開頭,當設計ADT包時我們練習了數據抽象。當我們選擇包應該有的方法時,我們沒有考慮如何表示包。相反我們集中考慮每個方法應該做什麼。
最後,我們編寫詳細說明該方法的Java接口。然後編寫一個使用包的客戶程序,但仍然不知道它的實現。如果有人為我們編寫了實現,我們的程序大概能正確執行。如果其他人給我們一個更好的實現版本,我們不需要修改已經編寫的客戶程序仍能繼續使用。客戶的這個特征是抽象的主要優勢。
最後更新:2017-06-26 16:02:11