1 理解接口與實現的區(qū)別
以上一篇文章的電視機需要插電使用的例子繼續(xù)來講解:請求對象(電視機),接口(插座),實現(發(fā)電廠)
對電視而言,插電使用,只需要標準的插座即可,具體的電從哪里來,是火力發(fā)電廠,或是太陽能發(fā)電,亦或是畜電池逆變供電,電視機是不需要關心的。
發(fā)電廠或供電設備屬于實現,220V交流電插座屬于接口。改變實現不會對電視機的使用產生影響,而改變接口則會。
- 接口:呈現給外部使用的服務屬于接口,進一步將,只需要呈現需要使用的接口。實現:實現的細節(jié)對外部是進行隱藏的,對代碼編寫來說,修改實現是不需要變動用戶代碼的。
2 使用抽象思維設計接口
面向對象編程的一大優(yōu)勢,是可以重用類,而這些可重用的類,接口通常比較抽象。
- 具體接口:功能明確抽象接口:通用性高
舉個例子:創(chuàng)建一個出租車對象,有抽象接口(送到機場)和具體接口(左轉、右轉、啟動、停止)
對于抽象接口,送到機場,不管是在哪座城市,哪個位置,都可以到達機場,只是具體的路徑可能會不一樣。
對于具體接口,左轉、右轉、啟動、停止,在每個城市,或每個位置,都需要具體的指明如何到達。
對比來看,抽象接口,更具有通用性。
3 思考過程
在設計類時,為了盡量隱藏內部原理,需要遵循一些規(guī)則:
- 只提供需要的接口,也意味著提供的接口盡可能少只有真正需要時才添加接口,不提供超出需求的接口可以先將接口都定義為私有,在開始使用該類時,將需要開放的接口改為公有
3.1 確定用戶
在出租車的示例中,用戶是實際使用系統(tǒng)的人,那用戶具體是指誰呢?
對于要打車的人,確實屬于用戶。
對于出租車司機,想對于出租車這個對象來說,司機也屬于客戶。
注意:這里實際有3個對象:出租車、打車的人、司機
然后用戶是2個:打車的人、司機
3.2 對象行為
確定出用戶之后,還要確定對象的行為。
確定對象行為,就是要從每個用戶視角,分析每個對象的目的以及需要做的事情。
3.3 環(huán)境約束
對象的功能可能會受到環(huán)境的影響,例如,在出租車的例子中,司機不能通過座壞了的橋,即使是最短的路徑。
3.4 識別公共接口
以租車對象為例,使用該對象時,需要的過程包括:
- 上車指明目的地付車費下車
對于打車的人,如果要打車,需要:
- 確定要去的地方打車給司機付錢
在程序設計開始,只需要先考慮如何使用這個對象,先不用考慮如何構建這個對象。在思考的過程中,可能會發(fā)現該對象需要一些額外的接口,比如:把行李放到后備箱等。
下面是一個Cabbie(出租車司機)的類圖,描述了其可用的方法。
3.5 識別實現
在公共接口確定了之后,接下來才是實現的過程。對于非公共接口,都可以認位是實現。
用戶不需要看到具體的實現過程。公共方法中的代碼,也屬于實現,用戶只能看到接口。
- 接口代表了用戶如何看待對象實現則是對象的具體細節(jié)
4 總結
本篇介紹了面對對象的程序設計中,如果以對象的方式進行思考,包括理解接口與實現的區(qū)別,使用抽象思維設計接口,以及具體的思考過程。