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