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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开闭原则coding

發(fā)布時間:2024/4/13 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开闭原则coding 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

開閉原則簡單一句話就是,實現(xiàn)應該對擴展開放,對修改關(guān)閉,那為什么說它是最重要的一個原則呢,因為它是所有原則中的一個基礎,包括后續(xù)的設計模式,本身通過設計模式可以解耦,提高軟件設計的擴展性,在實際開發(fā)過程中,都會碰到類似的一個問題,就是我們有一個需求,要進行開發(fā),不得不把我們的舊代碼引入進來,然后我們還要修改舊代碼,那么這個是非常容易引入錯誤的,如果時間緊我們又沒有時間重構(gòu),所以平時寫代碼的時候遵循這些原則,是非常有必要的,當然我們在開發(fā)的過程中,也可以進行重構(gòu),或者局部重構(gòu),來提高我們軟件系統(tǒng)的擴展性,提高內(nèi)聚降低耦合,那開閉原則的中心思想就是,我們要用抽象來構(gòu)建框架,用實現(xiàn)來擴展細節(jié),這些原則還比較抽象,我們就是通過coding來解決這些問題,那我們現(xiàn)在就來學習一下開閉原則,簡單的舉幾個小例子,然后大家再從這個例子中進行體會,我們這個項目是一個空的maven項目,創(chuàng)建包,設計原則 package com.learn.design.principle.openclose;/*** 課程* 他是一個接口* 接口我們最好是以i開頭* 正常來說一個課程它是一個實體* 我們可以去寫一個類* 有id,name,price三個成員變量* 但是我們是為了演示開閉原則* 因為開閉原則比較抽象* 我們這個例子是相對比較簡單的例子* 通過后序的一套課程* 我們會對開閉原則理解更深入* 那我們的課程有很多類型* 有JAVA的* 有算法的* 也有前端的* * 首先回到我們的接口* 首先我們修改了這個接口* 但是我們的接口是不應該經(jīng)常變化的* 他應該是穩(wěn)定且可靠的* 否則接口作為契約的效果也就失去了* 那我們再換一種思路* * 為什么一開始的Course是一個接口* 這里是為了演示面向接口編程* * 首先接口沒有變* * * @author Leon.Sun**/ public interface ICourse {/*** 這個接口可以返回課程的id* @return*/Integer getId();/*** 課程里面還有name* 課程的名字* 這個也是一個方法* * @return*/String getName();/*** 他里面還有一個價格* * 這里獲取原價* * @return*/Double getPrice();/*** 這里獲取打折的價格* 我們把這個方法去掉* * @return*/ // Double getDiscountPrice();} package com.learn.design.principle.openclose;/*** 我們創(chuàng)建一個類叫JavaCourse* 他實現(xiàn)了ICourse接口* 然后我們來實現(xiàn)這些方法* 那這個實現(xiàn)就比較簡單* * 然后這個類也進行了實現(xiàn)* 那假設我們的課程類型很多* 那所有的課程實現(xiàn)類都要實現(xiàn)一下這個方法* 那如果類少我們也就忍了* * 然后我們繼續(xù)來看這個類* 我們?nèi)绻ㄟ^JavaCourse來寫JAVA的一個子類* 我們來試一下* 我們新建一個類* * 他的實現(xiàn)類也沒有變* * @author Leon.Sun**/ public class JavaCourse implements ICourse{/*** 聲明ID* */private Integer Id;/*** 聲明名字* */private String name;/*** 聲明他的價格* */private Double price;/*** 聲明一個全參構(gòu)造器* 全部選擇* * @param id* @param name* @param price*/public JavaCourse(Integer id, String name, Double price) {/*** 其實這個環(huán)境this加不加都是一樣的* */this.Id = id;this.name = name;this.price = price;}public Integer getId() {return this.Id;}public String getName() {return this.name;}public Double getPrice() {/*** 我們在這里直接乘以0.8* 看似更簡單的完成這個需求* 這次只修改一個類* 我說的只修改一個類* 跟之前方法的兩個類* 是相對值* 如果我們的課程還有前端的課程* 還有算法課程* 還有python課程* 那他修改的是一個實現(xiàn)類的個數(shù)* 但是有一點是否滿足需求呢* 假設需求說我還要顯示原價* 這個方法是獲取不到原價的* 那再往復雜了說* 如果我們課程大于300元的* 才進行打八折活動呢* 后續(xù)再引入優(yōu)惠券* 所以這個方式我們獲取不到原價* */return this.price*0.8;}/*** 那我們的JavaCourse類要進行修改了* 至少我要實現(xiàn)這個方法* 假設現(xiàn)在做活動打八折* 乘以0.8* 看起來我們的需求完成了* 但是我們這種寫法我們來看一下* * 這邊也不用實現(xiàn)了* * * */ // @Override // public Double getDiscountPrice() { // return this.price*0.8; // }} package com.learn.design.principle.openclose;/*** JavaDiscountCourse他來繼承JavaCourse* JavaCourse里面沒有默認的構(gòu)造器* 我們在JavaCourse這里并沒有一個無參的構(gòu)造器* 但是那個不重要* 我們還是以課程的目標為準* 這里為什么要命名JavaDiscountCourse* 因為這是一個Java打折的課程* 那如果我們的這個折扣非常的簡單* 所有類型的課程都打折* 那我們就可以不叫JavaDiscountCourse* 直接叫做DiscountCourse* 打折的一個課程即可* * 然后我們來聲明一個子類來繼承JavaCourse* * 虛線的是實現(xiàn)接口* 實線的是繼承* 而子類的構(gòu)造器是調(diào)用父類的構(gòu)造器* 下邊的是方法* 一個是返回值是double的* originPrice* 還有一個是返回值的getPrice* 那我們現(xiàn)在的打折銷售也完成了* 我們修改的是比較偏應用級的代碼* 也就是在應用層的* 而底層的接口* 和底層的基類* 并沒有修改* 這樣也防止了風險的擴散* 接口里面有很多的方法* 實現(xiàn)類里面邏輯也比較復雜* 那如果我們改折后價的話* 有可能會修改里面的實現(xiàn)* 這個在開發(fā)里面都是容易引起bug的* 而我們通過繼承了一個基類* 使我們對于擴展是開放的* 而對于修改接口和基類是關(guān)閉的* 那我們變化的都是應用層的一個子模塊* 比如Test和新增了一個子類* 他影響的范圍是越大的* 越高層的影響的范圍就越小* 簡單的理解* 如果dao層里面變化了* 而這個DAO層被所有service引用* 再上層就是controller* 這個影響就非常大* 有可能我為了改A模塊* 所以我們在面向?qū)ο缶幊痰臅r候* 我們一定要強調(diào)開閉原則* 其他原則也是開閉原則的一個具體形態(tài)* 首先它提高我們的復用性* 而且提高了可維護性* 因為我們并不是一個人單打獨斗* 我們要考慮軟件的維護成本* 一個典型的例子就是Spring容器* 提供的控制反轉(zhuǎn)* 比如我們會注入一些對象* 來修改源碼的一些內(nèi)容* 就是把控制通過配置文件* 或者bean的配置方式* 而不是去修改Spring的源碼* 例如我們通過Spring的特性* 來完成單表登陸的功能* 如果你們團隊都遵循開閉原則* 我們的軟件項目以后維護起來也會非常容易的* 成本也會非常低* 我通過這個例子簡單的介紹一下* 開閉原則* 現(xiàn)在體會不深不要緊* 后續(xù)很多的設計模式不斷地加強鞏固* 那隨著我們課程的學習* 大家對這幾個原則理解也會越來越深的* 有些設計模式和原則會有沖突* 那其實就是一個平衡的問題* 這個后面再碰到我會詳細說的* * * * @author Leon.Sun**/ public class JavaDiscountCourse extends JavaCourse {public JavaDiscountCourse(Integer id, String name, Double price) {/*** IDEA默認給的就是這個*/super(id, name, price);}/*** 從名字上來看* 獲取原價* * @return*/public Double getOriginalPrice(){return super.getPrice()*0.8;}/*** 我們復寫父類的一個方法* * 我們還是回到這個類里面* * * @return*/public Double getDiscountPrice(){/*** 默認生成的是super.getPrice()* 也就是要調(diào)用父類的getPrice方法* 這里面直接乘以0.8* 如果我們這里要做分區(qū)間的折扣* 當前的價格大于200的時候* 我們可以打九折* 大于300我們打八折* 這里面我們就直接打折8折* 在這個地方留了一個伏筆* 后邊里氏替換原則的時候* 還會回來講一下這里* * */return super.getPrice()*0.8;}} package com.learn.design.principle.openclose;/*** 現(xiàn)在我們有一個測試函數(shù)* * 我們現(xiàn)在來看一下類結(jié)構(gòu)圖* 現(xiàn)在的類結(jié)構(gòu)圖非常的簡單* ICourse這個是一個接口* JavaCourse這里是一個類* 這個類實現(xiàn)這個接口* 非常清晰* 我們一定要善用IDEA里面的查看工具* 在我們看源碼的時候非常有用* 這里和標準的UML有一點小小的差異* 比如I就代表Interface* 也沒有用尖括號* 我們能看出來* 這個是他的類型* 現(xiàn)在的類結(jié)構(gòu)也是非常的簡單* 我們也輸出了信息* 雙十一和618要進行一個打折活動* 那我們怎么來開發(fā)這個需求呢* * 現(xiàn)在我們回到test里面* * * * * @author Leon.Sun**/ public class Test {public static void main(String[] args) {/*** 我們通過一個接口指向?qū)嶓w類* 第一門課程的ID是96* 名字是"Java從零到企業(yè)級電商開發(fā)"* 價格是348元* * 這個實現(xiàn)類就是JavaDiscountCourse* JAVA的折扣課程* 課程ID:96 課程名稱:Java從零到企業(yè)級電商開發(fā) 課程原價:278.40000000000003 課程折后價格:222.72000000000003元* 結(jié)果出來了* 這里是因為Doble丟失精度的問題* 通過BigDecimal的String構(gòu)造器* 對于BigDecimal要注意使用String構(gòu)造器* 那這個不是我們課程的重點* 通過BigDecimal就能夠解決他* 那么我們現(xiàn)在接著回來* * 他是一個接口* 對象來指向一個實例* 也可以理解成一個子類的實例* JavaDiscountCourse這個類繼承了JavaCourse類* JavaCourse類又實現(xiàn)了ICourse類* 可以簡單地理解* 所以實現(xiàn)是JavaDiscountCourse* 但是他的引用是ICourse* 所以我們在這里面想獲取原價的時候* 并沒有g(shù)etOriginalPrice* 那我們怎么辦啊* 很簡單* 我們debug來看一下* 我們看一下JavaDiscountCourse這個類* 我們看到他的類型就是JavaDiscountCourse* 因為我們是使用父類的引用* 所以他拿不到那個pulic方法* * */ICourse iCourse = new JavaDiscountCourse(96, "Java從零到企業(yè)級電商開發(fā)", 348d);/*** 我們對他直接進行強轉(zhuǎn)* 這樣我們就強轉(zhuǎn)成功了* */JavaDiscountCourse javaCourse = (JavaDiscountCourse) iCourse;/*** 然后我們直接輸出* System.out.println這個在實際項目中是禁止的* 因為在System.out里面是有鎖的* 現(xiàn)在只是一個調(diào)試講解設計模式* 我們就不引入log包了* 就用System.out調(diào)試理解即可* 首先是課程ID javaCourse.getId()* 然后呢課程的名稱javaCourse.getName()* 然后是課程的價格javaCourse.getPrice()* 單位是元* 課程ID:96 課程名稱:Java從零到企業(yè)級電商開發(fā) 課程原價:348.0 課程折后價格:278.40000000000003元* 現(xiàn)在我們的課程信息都正常輸出了* * 課程價格和折扣價格* 現(xiàn)在是直接通過getPrice()拿到的* 那我們的原價沒有了* * 課程折后價格* 課程原價還是javaCourse.getOriginalPrice()* */System.out.println("課程ID:" + javaCourse.getId() + " 課程名稱:" + javaCourse.getName() + " 課程原價:" + javaCourse.getPrice() + " 課程折后價格:" + javaCourse.getDiscountPrice() + "元");} }

?

總結(jié)

以上是生活随笔為你收集整理的开闭原则coding的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。