最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java設(shè)計(jì)模式--七大原則詳解

 更新時(shí)間:2021年07月19日 16:23:22   作者:吾仄lo咚鏘  
本篇文章主要對(duì)Java中的設(shè)計(jì)模式如,創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式以及7大原則進(jìn)行了歸納整理,需要的朋友可以參考下,希望能給你帶來幫助

設(shè)計(jì)模式

軟件設(shè)計(jì)模式(Design pattern),又稱設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。

打個(gè)比方就像蓋大廈和小木屋,當(dāng)功能簡單,函數(shù)和代碼少時(shí),我們能較輕松的直接上手;但如果是像大廈那樣,功能復(fù)雜,需求可能變化且代碼量大時(shí),我們就不能直接上手就來,需要像建筑圖紙那樣提前規(guī)劃設(shè)計(jì),那設(shè)計(jì)模式就像軟件(程序)的建筑圖紙。

設(shè)計(jì)模式的目的是為了讓軟件(程序)具有更好的:

1.代碼重用性

相同功能的代碼,不用多次編寫,降低冗余

2.可讀性

編程規(guī)范性, 便于其他程序員的閱讀和理解

3.可擴(kuò)展性

當(dāng)需要增加新的功能時(shí),非常的方便,也稱為可維護(hù)性

4.可靠性

當(dāng)我們?cè)黾有碌墓δ芎?,?duì)原來的功能沒有影響

5.使程序呈現(xiàn)高內(nèi)聚,低耦合的特性

模塊內(nèi)部緊密,但模塊間依賴小,一者出錯(cuò)不影響他者

單一職責(zé)原則

單一職責(zé)原則(Single responsibility principle),即一個(gè)類應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé)。如類A負(fù)責(zé)兩個(gè)不同職責(zé):職責(zé)1,職責(zé)2。當(dāng)職責(zé)1需求變更而改變A時(shí),可能造成職責(zé)2執(zhí)行錯(cuò)誤,所以需要將類A的粒度分解為A1、A2。

單一職責(zé)原則注意事項(xiàng)和細(xì)節(jié)

  • 降低類的復(fù)雜度,一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)。
  • 提高類的可讀性,可維護(hù)性
  • 降低變更引起的風(fēng)險(xiǎn)
  • 通常情況下,我們應(yīng)當(dāng)遵守單一職責(zé)原則,只有邏輯足夠簡單,才可以在代碼級(jí)違反單一職責(zé)原則;只有類中方法數(shù)量足夠少,可以在方法級(jí)別保持單一職責(zé)原則

在這里插入圖片描述

接口隔離原則

接口隔離原則(Interface Segregation Principle),即客戶端不應(yīng)該依賴它不需要的接口,即一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上。

比如:類A通過接口 I I I依賴類B,類C通過接口 I I I依賴類D,如果接口 I I I對(duì)于類A和類C來說不是最小接口,那么類B和類D必須去實(shí)現(xiàn)他們不需要的方法。

在這里插入圖片描述

按隔離原則應(yīng)當(dāng)這樣處理:將接口 I I I拆分為獨(dú)立的幾個(gè)接口,將類分別與他們需要的接口建立依賴關(guān)系,也就是采用接口隔離原則。

在這里插入圖片描述

依賴倒轉(zhuǎn)原則

依賴倒轉(zhuǎn)原則(Dependence Inversion Principle),依賴倒轉(zhuǎn)(倒置)的中心思想是面向接口編程,所謂“倒轉(zhuǎn)”是指抽象不應(yīng)該依賴細(xì)節(jié),而是細(xì)節(jié)應(yīng)該依賴抽象。也就是高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象。因?yàn)橄鄬?duì)于細(xì)節(jié)的多變性,抽象的東西要穩(wěn)定的多。

比如有個(gè)Person類,可以接受Email、QQ和微信的消息。如果都為其提供一個(gè)專門的方法,就會(huì)讓代碼非常的冗余:

在這里插入圖片描述

可以引入一個(gè)IReceiver接口,讓Person類依賴該接口。這樣QQ、微信和Email各自實(shí)現(xiàn)IReceiver里面的方法即可:

在這里插入圖片描述

里氏替換原則

里氏替換原則(Liskov Substitution Principle)要求所有引用基類的地方必須能透明地使用其子類的對(duì)象。也就是在繼承關(guān)系中,子類盡量不要重寫父類的方法。繼承實(shí)際上讓兩個(gè)類耦合性增強(qiáng)了,特別是運(yùn)行多態(tài)比較頻繁的時(shí),整個(gè)繼承體系的復(fù)用性會(huì)比較差。比如一種極端情況:一個(gè)類繼承了另一個(gè)類,但卻重寫了所有方法,那么繼承的意義何在?說好的復(fù)用呢?

在這里插入圖片描述

解決方法是把原來的父類和子類都繼承一個(gè)更通俗的基類,在適當(dāng)?shù)那闆r下,可以通過聚合,組合,依賴等來代替。

在這里插入圖片描述

開閉原則

開閉原則(Open Closed Principle)一個(gè)軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放(對(duì)提供方),對(duì)修改關(guān)閉(對(duì)使用方)。也就是當(dāng)軟件需要變化時(shí),盡量通過擴(kuò)展軟件實(shí)體的行為來實(shí)現(xiàn)變化,而不是通過修改已有的代碼來實(shí)現(xiàn)變化。用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)。開閉原則是編程中最基礎(chǔ)、最重要的設(shè)計(jì)原則。編程中遵循其它原則,以及使用設(shè)計(jì)模式的目的就是遵循開閉原則。

舉個(gè)違反開閉原則的例子:

矩形Retangle和圓形Circle繼承了圖形類Shape(提供方),畫圖類GraphicEditor(使用方)會(huì)調(diào)用相關(guān)屬性。

在這里插入圖片描述

但是如果再新增一個(gè)三角形,就要在使用方GraphicEditor新增對(duì)應(yīng)方法,修改地方較多,違背開閉原則。

在這里插入圖片描述

改進(jìn):把Shape做成抽象類并提供抽象方法draw,讓子類去實(shí)現(xiàn)即可。當(dāng)新增圖形種類時(shí),只需讓新的圖形類繼承Shape,并實(shí)現(xiàn)draw方法即可。使用方的代碼就不需要修改,滿足開閉原則。

在這里插入圖片描述

迪米特法則

迪米特法則(Demeter Principle)又叫最少知道原則,即一個(gè)類對(duì)自己依賴的類知道的越少越好,核心是降低類之間的耦合。也就是說,對(duì)于被依賴的類不管多么復(fù)雜,都盡量將邏輯封裝在類的內(nèi)部。對(duì)外除了提供的public 方法,不對(duì)外泄露任何信息。避免與非直接朋友的耦合,只與直接的朋友通信,所謂的直接朋友是出現(xiàn)成員變量,方法參數(shù),方法返回值中的類。而出現(xiàn)在局部變量中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變量的形式出現(xiàn)在類的內(nèi)部。

比如有學(xué)院員工類和學(xué)校員工類,然后各有一個(gè)管理類有可以獲取其所有員工,學(xué)校員工管理類有方法打印全部員工。

在這里插入圖片描述

具體代碼:

void printAllEmployee(CollegeManager sub) {
		//獲取到學(xué)院員工
		List<CollegeEmployee> list1 = sub.getAllEmployee();
		System.out.println("---學(xué)院員工---");
		for (CollegeEmployee e : list1) {
			System.out.println(e.getId());
		}
		//獲取到學(xué)??偛繂T工
		List<Employee> list2 = this.getAllEmployee();
		System.out.println("---學(xué)校員工---");
		for (Employee e : list2) {
			System.out.println(e.getId());
		}
	}

分析SchoolManager類,發(fā)現(xiàn)Employee和CollegeManager都是它的直接朋友(出現(xiàn)在參數(shù)和返回值中),但CollegeEmployee不是直接朋友,是以局部變量的形式,違背了迪米特原則。

改進(jìn):避免依賴CollegeEmployee,封裝在CollegeManager中,對(duì)外提供public方法即可。

在這里插入圖片描述

void printAllEmployee(CollegeManager sub) {
		sub.printEmployee();
		//獲取到學(xué)??偛繂T工
		List<Employee> list2 = this.getAllEmployee();
		System.out.println("---學(xué)校員工---");
		for (Employee e : list2) {
			System.out.println(e.getId());
		}
	}

合成復(fù)用原則

合成復(fù)用原則(Composite Reuse Principle)就是是盡量使用合成/聚合的方式,而不是使用繼承。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

設(shè)計(jì)原則核心思想

針對(duì)接口編程,把應(yīng)用中可能需要變化的代碼和不需要變化的代碼分開獨(dú)立。都是為了交互對(duì)象間解耦合而操心。

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 淺談JAVA 異常對(duì)于性能的影響

    淺談JAVA 異常對(duì)于性能的影響

    Java的異常處理為什么會(huì)影響性能?異常開銷很大。那么,這是不是就意味著您不該使用異常?當(dāng)然不是。但是,何時(shí)應(yīng)該使用異常,何時(shí)又不應(yīng)該使用異常呢?不幸的是,答案不是一下子就說得清楚的,我們來詳細(xì)探討下。
    2015-05-05
  • 解讀classpath讀取resources目錄下的文件

    解讀classpath讀取resources目錄下的文件

    這篇文章主要介紹了解讀classpath讀取resources目錄下的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • spring容器啟動(dòng)實(shí)現(xiàn)初始化某個(gè)方法(init)

    spring容器啟動(dòng)實(shí)現(xiàn)初始化某個(gè)方法(init)

    這篇文章主要介紹了spring容器啟動(dòng)實(shí)現(xiàn)初始化某個(gè)方法(init),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring boot中controller的使用及url參數(shù)的獲取方法

    spring boot中controller的使用及url參數(shù)的獲取方法

    這篇文章主要介紹了spring boot中controller的使用及url參數(shù)的獲取方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • mybatis-plus條件構(gòu)造器的操作代碼

    mybatis-plus條件構(gòu)造器的操作代碼

    mybatis-plus提供了AbstractWrapper抽象類,提供了很多sql語法支持的方法,比如模糊查詢,比較,區(qū)間,分組查詢,排序,判斷空,子查詢等等,方便我們用面向?qū)ο蟮姆绞饺?shí)現(xiàn)sql語句,本文重點(diǎn)給大家介紹mybatis-plus條件構(gòu)造器的操作代碼,感興趣的朋友一起看看吧
    2022-03-03
  • Java編寫多功能萬年歷程序的實(shí)例分享

    Java編寫多功能萬年歷程序的實(shí)例分享

    這里我們來作一個(gè)Java編寫多功能萬年歷程序的實(shí)例分享,可以查詢公元?dú)v、農(nóng)歷、節(jié)氣與節(jié)日等,十分全面,下面就來具體看一下:
    2016-06-06
  • MyBatis逆向?程的生成過程

    MyBatis逆向?程的生成過程

    MyBatis官方為我們提供了一個(gè)逆向工程,通過這個(gè)逆向工程,只要建立好數(shù)據(jù)表,那么MyBatis就會(huì)根據(jù)這個(gè)表自動(dòng)生成pojo類、dao接口、sql映射文件
    2023-02-02
  • Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))

    Spring和SpringMVC父子容器關(guān)系初窺(小結(jié))

    這篇文章主要介紹了Spring和SpringMVC父子容器關(guān)系初窺(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系

    關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系

    這篇文章主要介紹了關(guān)于WeakhashMap與HashMap之間的區(qū)別和聯(lián)系,WeakHashMap從名字可以得知主要和Map有關(guān),不過還有一個(gè)Weak,我們就更能自然而然的想到這里面還牽扯到一種弱引用結(jié)構(gòu),因此想要徹底搞懂,我們還需要知道四種引用,需要的朋友可以參考下
    2023-09-09
  • SpringBoot整合Servlet和Filter和Listener組件詳解

    SpringBoot整合Servlet和Filter和Listener組件詳解

    這篇文章主要介紹了SpringBoot整合Servlet和Filter和Listener組件詳解,在整合某報(bào)表插件時(shí)就需要使用Servlet,Spring Boot中對(duì)于整合這些基本的Web組件也提供了很好的支持,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

喜德县| 元阳县| 昌乐县| 芦溪县| 河北区| 万年县| 同仁县| 桓仁| 哈尔滨市| 孟连| 广丰县| 福贡县| 肃宁县| 灯塔市| 霍山县| 正阳县| 香格里拉县| 左贡县| 上思县| 武胜县| 嘉峪关市| 循化| 扬州市| 湖南省| 梅州市| 大余县| 安福县| 南陵县| 桑植县| 虹口区| 太原市| 温泉县| 普兰县| 崇州市| 锦屏县| 阳朔县| 沂源县| 杭锦后旗| 册亨县| 砀山县| 洮南市|