日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OOP 面向对象 七大原则 (一)

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OOP 面向对象 七大原则 (一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OOP 面向對象? ?七大原則 (一)

  大家眾所周知,面向對象有三大特征繼承封裝多態的同時,還具有這七大原則,三大特征上一篇已經詳細說明,這一篇就為大家詳解一下七大原則: 單一職責原則,開閉原則,里氏替換原則,依賴倒置原則,接口隔離原則,迪米特法則,組合聚合復用原則

  單一職責原則:一個類只負責一個領域的內容,簡而言之就是自己的類負責自己的事情,與別的類互不干涉

  場景案例:女孩子購物

  

/*** 	oop 單一原則實現*  @author gongliying* 	@data 2019-06-10*/aaa(){class People{getAll(){console.log("打車去Dior實體店買口紅")console.log("打車去Only實體店買裙子")}}new People().getAll();}

   打車去實體店買口紅跟打車去實體店買裙子,我雖然寫在了同樣一個方法里面,但是呢卻不能同時進行

    解決思路:面向對象單一職責,一個類只做一件事情,互不干涉

aaa(){class People{Dior(content){console.log('打車去Dior實體店買' + content)}Only(content){console.log('打車去Only實體店' + content)}getAll(){this.JD('口紅')this.TM('裙子')}}new People().getAll();        //打車去Dior實體店買口紅
                                     //打車去Only實體店買裙子
                                        }

  這樣事情就解決了,一個類方法只做一件事情,我在Dior的方法中只能去買口紅,不能去進行買裙子的操作,這就是單一原則

?  開閉原則:對修改關閉,對擴展開放

    一個對象(模板,類,方法)只要是在生命周期內,都會發生變化,而開閉原則就是在不修改原有模塊的基礎上,擴展其功能

    還以口紅為例,商場中有一家店面里面之后Dior和CHANEL兩個品牌,那么店員介紹的品牌不是Dior就是CHANEL,一般情況下都會這樣寫

/*** oop 開閉原則實現* @author 宮麗穎* @date 2019-06-13*/achieve(){let  type ='dior' if (type == 'dior') {console.log('這是dior')}else{console.log('這是chanel')}}        
     //這是dior

?

    這樣寫是沒有什么問題的,但是呢,店面中又有新牌子了ysl,這就變成不是dior 不是CHANEL就是ysl了? 隨之我們的代碼就又變成的這樣  

/*** oop 開閉原則實現* @author 宮麗穎* @date 2019-06-13*/achieve(){let  type ='chanel' if (type == 'dior') {console.log('這是dior')}else if(type == 'chanel'){console.log('這是chanel')}else{console.log('這是ysl')}
                    //這是chanel},

?

    隨著商店店面更新的口紅牌子越來越多,需求越來越多的時候,隨之意味這樣的代碼,對原來代碼的修改也越來越多,如果一不小心改錯的話,可能整段就垮掉,為了解決這樣的事件,建議使用開閉原則,對修改關閉,對擴展開放

/*** oop 開閉原則實現* @author 宮麗穎* @date 2019-06-13*/achieve() {let  type = 'ysl'if (type == 'dior') return this.dior.dior();if (type == 'chanel') return this.chanel.chanel();if (type == 'ysl') return this.ysl.ysl();},dior : {dior() {alert('這是dior')}},chanel : {chanel() {alert('這是chanel')}},ysl : {ysl() {alert('這是ysl')}}           //結果為彈出  這是ysl

  這樣增加需求的時候直接在data里面定義一個就好了,再多的需求也不怕不怕啦~~~

  里氏替換原則:父類能出現的地方,可以用子類代替,子類擁有父類的所有屬性和方法,通俗來說子類擁有父類的功能,可以拓展父類的功能,但是不能修改父類的功能

  口紅為例?

/*** oop 里氏替換原則實現* @author 宮麗穎* @date 2019-06-13*/achieve() {class Kouhong{constructor(e){this.name=e.namethis.price=e.price}look(){console.log(this.name,'的口紅,一共',this.price,'元')}}//子類class Dior extends Kouhong{look(){console.log('這是',this.name,'的口紅,一共',this.price)}}var kouhong = new Kouhong({name:"磚紅色",price:300})var dior =new Dior({name:"臟橘色",peice:280})kouhong.look()   //磚紅色 的口紅,一共 300 元dior.look()      //這是 大紅色 的口紅,一共 280},

  這樣寫的話,你會發現子類直接覆蓋了父類的內容,修改了父類的功能,雖然代碼上沒什么問題,但是對于以后的優化有著很大的影響,也違背了里氏替換原則,里氏替換原則要求擁有父類的所有方法,可以擴展父類的方法,但是不能修改,我用歷史替換比較一下

/*** oop 里氏替換原則實現* @author 宮麗穎* @date 2019-06-13*/achieve() {class Kouhong{constructor(e){this.name=e.namethis.price=e.price}look(){console.log(this.name,'的口紅,一共',this.price,'元')}saw(){console.log('口紅很貴哦的!!')}}//子類class Dior extends Kouhong{look(){console.log('這是',this.name,'的口紅,一共',this.price)}}class CHANEL extends Kouhong{see(){console.log('這是',this.name,'的口紅,一共',this.price,'元')}so(){console.log('因為那么貴所以才買不起嘛!!!!')}}var kouhong = new Kouhong({name:"磚紅色",price:300})var dior =new Dior({name:"臟橘色",price:280})var chanel = new CHANEL({name:"豆沙色",price:320})kouhong.look()      //磚紅色 的口紅,一共 300 元            父類本身dior.look()         //這是 臟橘色 的口紅,一共 280          子類1繼承父類將父類方法覆蓋chanel.look()       //豆沙色 的口紅,一共 320 元       子類2繼承父類顯示父類方法chanel.see()        //這是 豆沙色 的口紅,一共 320 元     子類2在繼承父類上擴展自己的方法chanel.saw()        //口紅很貴哦的!!             子類2繼承父類另一個方法    子類繼承了父類的所有方法chanel.so()         //因為那么貴所以才買不起嘛!!!!        子類2擴展自己的另一個方法},

  由此可見,子類1在繼承父類的時候將父類覆蓋,但是子類2在繼承父類的時候繼承了父類的所有方法并擴展了自己的方法,這就是里氏替換原則

?  依賴倒置原則:程序要依賴于抽象接口,不要依賴于具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。(節選自百度百科)

    emmmm,很官方的一句話 ,我用白話解釋一下,就是說高層的模塊不要依賴于低層的模塊,不要靠比自己層級低的模塊,高層低層應該同時依靠抽象,而抽象不應該依賴于細節而是應該細節依賴抽象 ,要是還沒有懂的話,畫張圖把,當然還是口紅為例了

這樣看是不是看懂了呢 這個人就是高層,左圖就是在說 高層依賴低層,如果這個高層抹口紅就只能抹口紅,不能在抹其他的 ,要是想在抹別的,就要再加方法,太啰嗦

                 而右圖就是在說明定義了一個抽象類抹,如果沒有口紅了還可以抹眼影啊,粉底之類的,人與眼影之間依賴抹這個抽象類來實現,這個抹眼影 這個細節依賴于抽象抹這個類,而這個高層人也可以創建不同的高層話不多說,代碼附上

                    class cosmetics{daub(){console.log('抹了什么?')}}class kouhong extends cosmetics{go(){return "抹了口紅"}}class yanying extends cosmetics{go(){return "抹了眼影"}}class fendi extends cosmetics{go(){return "抹了粉底"}}class people {constructor(name) {this.name = name}gotoEat(mo) {console.log(this.name, mo.go())}}kouhong = new kouhongyanying = new yanyingfendi = new fendigong = new people('宮')liying = new people('麗穎')gong.gotoEat(kouhong)      //宮 抹了口紅gong.gotoEat(yanying)      //宮 抹了眼影gong.gotoEat(fendi)        //宮 抹了粉底liying.gotoEat(fendi)      //麗穎 抹了粉底

  結果我不僅通過抹的抽象類,創建了不同的細節,還創建不同的高層,不同的人通過抹的類創建了不同的細節,他們之間是不會相互影響的,這就是依賴倒置原則。

  

轉載于:https://www.cnblogs.com/gongliying/p/11000060.html

總結

以上是生活随笔為你收集整理的OOP 面向对象 七大原则 (一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。