面向對象理解及設計模式八大原則

面向對象的概念:

        所謂面向對象,即時對現實世界事物的抽取,例如我們以人作爲抽象,一個人有名字,身高,體重,這些都是對人類的抽象,而身高,體重,等我們一般把其成爲屬性,可以理解爲在某一時間段它是靜態的,不變的,還有另一種抽象,是動作的抽象,例如一個人會跑,游泳等,是動態的,由一個或幾個步驟按照一定的順序組合而成。

面向對象的作用:

        任何一種思想的作用都是把複雜變成簡單,面向抽象也不例外,因爲抽象是我們人的一種基本的思維習慣,簡單來說就是想象,所有它是符合人類的思考方式的,它還有一種重要的功能,就是代碼的複用,例如java裏面的抽象類,你可以寫一個動物類,在此基礎上拓展出人類,狗,貓,因爲動物都是有一些共通點的,例如都會跑,吃飯,但是這些動作又是不盡相同的,例如人會坐着拿着碗吃飯,而狗會站着吃狗糧,所以當我們需要寫相關業務時,我們如調用他人的框架,一般都有一個統一的接口,或我們需要實現某一個方法,這就是抽象的表現。

八大原則:

1.依賴倒置原則:

    概念:

             高層模塊不應依賴底層模塊,二者皆應依賴於抽象類

    理解:

             什麼是高層模塊,什麼是底層模塊呢?舉一個例子,我是一個人,我要開車出去旅遊,我就是一個高層模塊,車就是一個底層模塊,爲什麼呢?因爲我沒有車我就沒辦法出去旅遊啊,但有一個問題,我需要開特定某一種牌子的車嗎(GTR,思域,寶馬...),如果我原來是開GTR的,但我的GTR因爲某些原因壞了,但我還有一臺寶馬,我會因爲換了一臺車我就不會開嗎?不會的,因爲只要我有駕駛照,我知道怎麼開車,無論是GTR還是AE86,我都是秋名山車神,所有我並不就會開某一牌子的車,我只是依賴於車這一抽象的概念(我知道怎樣開車),而無論是GTR,還是寶馬,他們同樣依賴於車這一抽象的概念,因爲他們都有一個統一的標準(就像我們的抽象類,接口一樣),只要他們實現了這個車這個抽象類,它就是一輛車。

2.開放閉封原則:

    概念:

             在實際開發中,我們都應該接收增加,關閉修改。

    理解:

             增加,指的是在原有代碼上增加新的功能,例如新加功能函數等,修改指的是修改原有的函數,成員變量等,爲什麼呢?我們又舉一個栗子,我是一個木匠,有一天,有一個美女叫我幫她搞一張世界上最漂亮的凳子,因爲我是一隻舔狗,所有我肯定會滿足我女神的要求,我就搞了九九八十一天,終於把這張凳子搞出來了,我再給這張凳子塗上我以爲女神喜歡的粉紅色,當我滿心歡喜送給我女神的時候,我女神確說喜歡白色,我現在有2個選擇,一個是再搞個九九八十一天,再搞一張出來,另外是在原來的基礎上塗一層白色,你會怎樣選?肯定是塗一層啊,怎麼可能再搞一張?這就是我們的關閉修改原來的結構,只增加的原則。

3.單一責任原則:

    概念:

             一個類能夠引起它發生改變的只能是因爲某一種的原因,不然會耦合度過高。

    理解:

            它的意思還簡單嘛,我還是舉個栗子,我有一個專門用來裝綠茶的杯子(我可喜歡喝綠茶呢),但有一天我女朋友下班回家,口渴了,一時沒有找到合適裝水的杯子,但發現了我的綠茶杯子,她竟然用來裝可樂了,而且喝完還不洗,當我下一次喝綠茶的時候,我也沒注意,就用來泡綠茶了,喝完之後我上了九九八十一次廁所,然後我就因爲拉肚子而與世長辭,我女盆友也找了別的男人,這就是一個事務責任過多的後果,類裏面的一個功能因爲另一個功能的改變而被破壞,這就是一個耦合的問題,所有我們應該用來喝茶的杯子就用來喝茶,最多原來是喝綠茶的,改用來喝紅茶(類的改變因爲某一類原因發生了改變),絕不會用來喝可樂。

4.子類可替換父類的原則:

    概念:

             在軟件中將一個基類對象替換成它的子類對象,程序將不會產生任何錯誤和異常,反過來則不成立,如果一個軟件實體使用的是一個子類對象的話,那麼它不一定能夠使用基類對象。

    理解:

             例如我喜歡狗,二哈,柯基都是狗,所以我都喜歡,但你並不能說我喜歡動物,說我喜歡蛇,獅子,但如果我說我喜歡動物,你可以理解爲我喜歡貓,狗,豬.....動物是狗的父類,狗是動物的子類。

5.接口隔離的原則:

    概念:

             客戶端不應該依賴它不需要的接口;一個類對另一個類的依賴應該建立在最小的接口上。

    理解:

            意思就是一個類作爲接口或抽象類,它應該儘可能把它的成員變量設爲private,protect,因爲如果你把一些實現它的類一些它並不需要的方法或變量設爲public,實現類就有可能接觸到這些數據,從而改變他們,這樣會造成一些不必要的bug,例如我們現在用到的windows系統,它並不是開源的,所以我們也不能改變或看到它的源代碼,如果它把它的功能全部都開放,那就有一些電腦小白在不知情的情況下,無意間修改了一些代碼,從而導致整個系統的癱瘓。

6.優先使用對象組合,而不是繼承:

    概念:

             對象組合就是在一個類裏面有以另外一個類作爲數據類型的成員變量,繼承就是子類繼承父類。

    理解:

             爲什麼呢?因爲類的繼承通常會破壞封裝性,舉個栗子,你是你爸生的,你敢說你爸沒有對你一點影響嗎,不存在的,繼承就像是老爹,強耦合,離不開,組合像什麼呢,不知道你玩不玩LOL,我喜歡玩亞縮,如果我第一件就出綠叉,但某一天綠叉被削了,那我可以改出無盡啊,我可以喜歡出什麼就出什麼,不會因爲我出了綠叉就不能出無盡,繼承就像是老爹,組合就像是小三,不愛了,就離開。

7.封裝變化點:

    概念:

             將變化和穩定的隔離開來。

    理解:

             爲什麼呢?這其實和我上一個和綠茶的例子差不多,我這個杯子就是用來喝綠茶的(穩定點),我不會用來做其他事情,這我就不會因爲腹瀉而與世長辭,大不了我就再買一個杯子,但我每次喝東西之前我都會洗一洗(不穩定點),別讓你的變化的因素影響到你的穩定因素,這非常重要。

8.針對接口式的編程,而不是針對實現類編程:

    概念:

             接口式編程就是我們儘可能地寫接口,寫標準,而不是爲了某一個事務而寫一個類。

    理解:

             這是最重要的一點,從古至今,掌握標準無一不是行業的leader,這和我們敲代碼是一樣的,因爲制定一個標準,以爲着我們以後可以根據這個接口進行拓展就可以,這大大減少了我們重複寫代碼的工作,例如我們寫了一個支付的功能,我們這個項目是根據微信支付的流程來做的,我們爲此而寫了一個類,但下一次我們同樣開發支付功能,但淘寶支付功能流程和微信其實是差不多的,我們還要再重新寫一個類嗎,如果我們寫微信支付的時候把寫成一個標準,下一次再開發淘寶支付的時候是不是就能寫少很多代碼呢?????

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章