設計模式(一)——基本概念

一、設計模式的目的

      軟件編寫過程中,程序員面臨着來自耦合性、內聚性以及可維護性、可擴展性,重用性,靈活性等多方面的挑戰,設計模式是爲了讓程序(軟件),具有更好的

  1. 代碼重用性(即:相同功能的代碼,不用多次編寫);
  2. 可讀性(即:編程規範性,便於其他程序員的閱讀和理解)
  3. 可靠性(即:當需要增加新功能的時候,非常的方便,成爲可維護)
  4. 易擴展性(即:當我們增加新的功能後,對原來的功能沒有影響)
  5. 高內聚、低耦合

二、設計模式七大原則

1、單一職責原則

      對類來說,即一個類應該只負責一項職責。如果類A負責兩個不同職責:職責1、職責2。當職責1需求變更而改變A時,可能造成職責2執行錯誤,所以需要將類A的粒度分解爲A1,A2。
      單一職責原則注意事項和細節
1)降低類的複雜度,一個類只負責一項職責;
2)提高類的可讀性,可維護性;
3)降低變更引起的風險;
4)通常情況下,我們應當遵守單一職責原則,只有邏輯足夠簡單,纔可以在代碼級違反單一職責原則;只有類中方法數量足夠少,可以在方法級別保持單一職責原則。

2、接口隔離原則

      客戶端不應該依賴它不需要的接口,即一個類對另一個類的依賴應該建立在最小的接口上。
在這裏插入圖片描述
      A通過Interface1會依賴(使用B),但是A中只會使用到接口的1,2,3三個方法;C通過Interface1會依賴使用D,但是C中只會使用到接口的1,4,5三個方法。
       類A通過接口Interface1依賴類B,類C通過接口Interface1依賴類D,如果接口Interface1對於類A和類C來說不是最小接口,那麼類B和類D就必須去實現它們不需要的方法。
      按隔離原則應當這樣處理:將接口Interface1拆分爲獨立的幾個接口,類A和類C分別與它們需要的接口建立依賴關係。也就是採用接口隔離原則。
在這裏插入圖片描述

3、依賴倒轉(倒置)原則

依賴倒轉原則是指:
      1)高層模塊不應該依賴底層模塊,二者都應該依賴其抽象;
      2)抽象不應該依賴細節,細節應該依賴抽象;
      3)依賴倒轉(倒置)的中心思想是面向接口編程;
      4)依賴倒轉是基於這樣的設計理念:相對於細節的多變性,抽象的東西要穩定的多。以抽象爲基礎搭建的架構比以細節爲基礎的架構要穩定的多。在java中,抽象指的是抽象類或接口,細節就是具體的實現類;
      使用接口或者抽象類的目的是制定好規範,而不涉及具體的操作,把展現細節的任務交給它們的實現類去完成。
依賴關係有三種傳遞方式:(1)接口傳遞;(2)構造方法傳遞;(3)setter方式傳遞。

4、里氏替換原則
基本介紹
  • 里氏替換原則在1988年,由麻省理工學院的一位姓裏的女士提出的;
  • 如果對每個類型爲T1的對象o1,都有類型爲T2的對象o2,使得以T1定義的所有程序P在所有的對象o1都替換成o2時,程序P的行爲沒有發生變化,那麼類型T2是類型T1的子類型。換句話說,所有引用基類的地方必須能透明地使用其子類的對象。
  • 在使用繼承時,遵循里氏替換原則,在子類中儘量不要重寫父類的方法;
  • 里氏替換原則告訴我們,繼承實際上讓兩個類耦合性增強了,在適當的情況下,可以通過聚合、組合、依賴來解決問題。
5、開閉原則
基本介紹
  • 開閉原則是編程中最基礎、最重要的設計原則;
  • 一個軟件實體如類,模塊和函數應該對擴展開放(對提供方),對修改關閉(對使用方)。用抽象的構建框架,用實現擴展細節。
  • 當軟件需要變化時,儘量通過擴展軟件實體的行爲來實現變化,而不是通過修改已有的代碼來實現變化;
  • 編程中遵循其他原則,以及使用設計模式的目的就是遵循開閉原則。
6、迪米特法則
基本介紹
  • 一個對象應該對其他對象保持最少的瞭解;
  • 類與類關係越密切,耦合度越大;
  • 迪米特法則又叫最少知道原則,即一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供的public方法,不對外泄露任何信息;
  • 迪米特法則還有個更簡單的定義:只與直接的朋友通信。
  • 直接的朋友:每個對象都會與其他對象有耦合關係,只要兩個對象之間有耦合關係,我們就說這兩個對象之間是朋友關係。耦合的方式很多,依賴,關聯,組合,聚合等。其中,我們稱出現成員變量,方法參數,方法返回值中的類爲直接的朋友,而出現在局部變量中的類不是直接的朋友。也就是說,陌生的類最好不要以局部變量的形式出現在類的內部。
7、合成複用原則
基本介紹
  • 原則是儘量使用合成/聚合的方式,而不是使用繼承。

三、UML基本介紹

UML類圖

(1)用於描述系統中的類(對象)本身的組成和類(對象)之間的各種靜態關係;
(2)類之間的關係:依賴、泛化(繼承)、實現、關聯、聚合、組合。
在這裏插入圖片描述

類圖——依賴關係

      只要是在類中用到了對方,那麼它們之間就存在依賴關係。如果沒有對方,連編譯都通過不了。
在這裏插入圖片描述
在這裏插入圖片描述
(1)類中用到了對方;
(2)如果是類的成員屬性;
(3)如果是方法的返回類型;
(4)是方法接收的參數類型;
(5)方法中使用到。

類圖——泛化關係

      泛化關係實際上就是繼承關係,它是依賴關係的特例。如果A繼承了B,我們就說A和B存在泛化的關係。
在這裏插入圖片描述
在這裏插入圖片描述

類圖——實現關係

      實現關係實際上就是A類實現B類,他是依賴關係的特例。
在這裏插入圖片描述
在這裏插入圖片描述

類圖——關聯關係
  • 關聯關係實際上就是類與類之間的聯繫,它是依賴關係的特例;
  • 關聯具有導航性:即雙向關係或單向關係;
  • 關係具有多重性:如:“1”(表示有且僅有一個),“0 . . .”(表示0個或者多個),“0,1”(表示0個或者一個),“n . . . m”(表示n到m個都可以)
類圖——聚合關係(Aggregation)

      聚合關係表示的是整體和部分的關係,整體與部分可以分開。聚合關係是關聯關係的特例,所以他具有關聯的導航性和多重性。
      如:一臺電腦由鍵盤、顯示器、鼠標等組成;組成電腦的各個配件是可以從電腦上分離出來的,使用帶空心菱形的實線來表示。
在這裏插入圖片描述
在這裏插入圖片描述

類圖——組合關係

      組合關係:也是整體與部分的關係,但是整體與部分不可以分開。
      如:在程序中我們定義實體,Person與IDCard、Head,那麼Head和Person就是組合,IDcard和Person就是聚合。
      但是如果在程序中Person實體中定義了對IDCard進行級聯刪除,即刪除Person時連同IDCard一起刪除,那麼IDCard和Person就是組合了。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200630063416517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNzY1MDY4,size_16,color_FFFFFF,t_70
在這裏插入圖片描述

總結

      泛化(繼承)和實現是依賴的特例,關聯也是依賴的特例,組合和聚合是關聯的特例。歸結到底,這六種關係都可以歸結爲一種,那就是依賴。只是根據實際情況的不同,又細分爲另外的五種。

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