1. 程式人生 > >OOAD-設計模式(一)概述

OOAD-設計模式(一)概述

具體類 設計模式的 頂級 http 引用 pen 屬性 整體 依賴倒轉原則

前言

  在我們很多時候設計代碼都是需要用到各種不一樣的設計模式的,接下來著幾篇給大家領略一下設計模式。知道設計模式的作用,以及在代碼的具體體現。很多時候我們看不懂代碼就是因為我們不知道它使用的設計模式。

  國慶的我很痛苦,學習是痛苦的,成長是快樂的!

一、什麽是面向對象

1)面向對象(Object-Orientation,簡稱OO)是一種系統建模技術/編程思想

2)面向對象編程(Object-Orientation Programming,簡稱OOP)是按照OO的方法學來開發程序的編程方式

3) 面向對象分析方法 Object-Oriented Analysis,簡稱OOA

分析階段主要解決以下問題:

  • 建立針對業務問題域的清晰視圖
  • 列出系統必須要完成的核心任務
  • 針對問題域建立公共詞匯表
  • 列出針對此問題域的最佳解決方案

此階段要解決的核心問題是"what to do?"

4) 面向對象設計 Object-Oriented Design, 簡稱OOD

設計階段主要解決以下問題:

  • 如何解決具體的業務問題
  • 引入系統工作所需的各方面的支持元素
  • 定義系統的實現策略

   此階段要解決的核心問題是"How to do?"

5)OO: 面向對象,是一套集編程思想,方法,原則,模式,解決方案等為一體的編程模式。OO的思想貫穿於整個軟件開發的過程,比如需求分析,設計,編程,測試,升級等。

綜上可以知道什麽是OOAD?

OOAD(Object Oriented Analysis Design,面向對象的分析和設計面向對象分析與設計)是現代軟件企業廣為采用的一項有效技術。OOAD方法要求在設計中要映射現實世界中指定問題域中的對象和實體

例如:顧客、汽車和銷售人員等。這就需要設計要盡可能地接近現實世界,即以最自然的方式表述實體。所以面向對象技術的優點即為能夠構建與現實世界相對應的問題模型,並保持他們的結構、關系和行為為模式。

二、面向對象的特點

2.1、抽象

  抽象就是將一些事物的共性和相似點抽離出來,並將這些屬性歸為一個類,這個類只考慮這些事物的共性和相似之處,並且會忽略與當前業務和目標無關的那些方面,只將註意力集中在與當前目標有關的方面。  

  忽略掉一個對象或實體的細節只關註其本質特征的過程

2.2、封裝

  封裝是為了隱藏內部實現細節,是保證軟件部件具有優良的模塊性的基礎。封裝的目標就是要實現軟件部件“高內聚,低耦合”,防止程序之間的相互依賴性帶來的變動影響。  

  目的:實現信息的隱藏
  1)屬性信息
  2)行為的操作的信息
    隱藏方法實現的細節。
    代碼重用。

2.3、繼承  

  在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若幹新的內容,或修改原來的方法(Override,重寫方法)使之更適合特殊的需要,這就是繼承。   繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關系,提高了軟件的可重用性和可擴展性。

  is a

1)子類可以繼承父類的屬性、方法
2)子類可以有自己的特性存在。

2.4、多態  

  多態是運行時刻接口匹配的對象相互替換的能力。指程序定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編譯期並不確定,而是在程序運行期間才確定(稱之為動態綁定),     即一個引用變量指向的是哪個類的實例對象,在編譯期間並不確定,在運行階段才能決定,因此,這樣就可以使得引用變量綁定到各種不同的類實現上,從而實現不同的行為。多態性增強了軟件的靈活性和擴展性。

  多態:相同類域的不同對象調用相同方法時的不同表現形式

Personp1=newStudent();
Personp2=newTeacher();
p1.work();//聽課
p2.work();//講課
 

1)子類繼承父類,類實現接口
2)子類重寫父類的同名方法,類實現接口中的抽象方法
3)父類的引用指向子類的對象,接口類型的引用指向具體實現類的對象

重寫/重載
編譯時多態:重載
運行時多態:重寫

三、OOP(面向對象編程)

  類:屬性 方法

抽象 實例化
  事物--------------->類-------------->內存中的對象

3.1、對象分類

域對象:在整個對象的設計過程中,側重於做數據的封裝/傳遞。用來做數據處理的類,信息的載體。POJO,JavaBean.

行為對象:側重於行為的操作,邏輯的實現。此類對象常見於接口的實現類,抽象類的擴展類.

3.2、類(對象)之間的關系

1)繼承關系:is a

2)依賴關系:類A對象中並不需要存在有類B類型的對象屬性,而是在使用時,直接在方法中實例化類B(new對象)來調用相關的業務方法來完成整個業務操作。

3)關聯關系:對象之間交互時的一種引用方式,當一個對象通過另外一個對象的引用(成員變量)去使用另外一個對象的服務或操作時,兩個對象時間便產生了關聯。

關聯關系又可總體分為聚合關系和組合關系:

聚合關系和組合關系的特點及其區別:

1.聚合關系也稱"has-a"關系,組合關系也稱"contains-a"關系
聚合(Aggregation): ---Has a---------人擁有電腦
組合(Composition): ---Contains a---人是由腳、身體、頭等部分組成的

2.聚合關系表示事物的整體/部分關系的較弱情況,組合關系表示事物的整體/部分關系的較強的情況.

3.聚合關系中,代表部分事物的可以屬於多個聚合對象,可以為多個聚合對象共享,而且可以隨時改變它所從屬的聚合對象.代表部分事物的對象與代表聚合事物對象的生存期無關,

一旦刪除了它的一個聚合對象,不一定也就隨即刪除代表部分事物的對象.
在組合關系中,代表整體事物的對象負責創建和刪除代表部分事物的對象,代表部分事物只屬於一個組合對象.一旦刪除了組合對象,也就隨即刪除了相應的代表部分事物的對象.

3.3、OOP的過程中核心原則

1)盡量能使用封裝的特性就是用封裝

2)面向接口編程

3)重組合/聚合而輕繼承

四、抽象類和接口的選擇問題

4.1、語法角度

Interface:
屬性:public static final
方法:只能是抽象方法(JDK8除外)
註意: 可以沒有任何方法
作用: 被類實現

abstract class
屬性:正常屬性
方法:可以是普通方法,也可以是抽象方法
註意: 可以沒有任何抽象方法
作用: 被類繼承

4.2、設計角度

一個類可以實現多個接口
一個類只能繼承一個父類
接口是抽象類的極致的抽象

4.3、思想角度

類進行抽象的時候是否關註屬性

盡量讓問題域獨立存在,盡量不要把所有的屬性或者方法都放到一個抽象類或者接口中

4.4、舉例

一個關於門的設計問題

門都有倆個基本的行為 open close

將來系統中會出現很多種門(不同的類)
MyDoor1 MyDoor2 MyDoor3 MyDoor4

這些類都具備open close的行為,但是具體實現又不一樣.
如何選擇:
1.抽象出一個抽象類,類中倆個抽象方法open close
2.抽象出一個接口,接口中倆個抽象方法open close

alarm

將來多了一個新的功能:警報器
  1)抽象出一個抽象類,類中倆個抽象方法open close
    MyDoor1 extends Door

  2)抽象出一個接口,接口中倆個抽象方法alarm

五、設計模式概述

5.1、定義

  對軟件設計問題的可重用的解決方案.

5.2、作用

1)重用設計比重用代碼更有意義,可充分利用已有的軟件開發經驗.
2)為設計提供共同的詞匯,方便交流和書寫開發文檔.
3)降低錯誤可能性.
4)節省時間.

好的軟件系統設計至少應該具備以下三點:
可擴展性(Extensibility)
靈活性(Flexibility)
可插入性(Pluggability)

5.3、面向對象設計原則

  常用基本的設計原則有七個:

1)單一職責原則(Single Responsibility Principle,SRP)
類的職責要單一,不能將太多職責放在同一個類中.

2)開閉原則(Open-Closed Principle, OCP)
對擴展開放,對修改關閉。軟件設計應該盡可能的使架構穩定而且又容易滿足不同的需求,提高代碼可重用性。理論上希望能達到不修改源代碼的前提下擴展功能。

3)裏氏代換原則(Liskov Substitution Principle,LSP)
在系統中,一個可以接受基類對象的地方必然可以接受一個子類對象。

4)依賴倒轉原則(Dependency Inversion Principle,DIP)
要針對抽象編程,而不是針對具體類編程.

5)接口隔離原則(Interface Segregation Principle,ISP)
使用多個專門的接口來取代一個統一的接口.

6)合成復用原則((Composition/Aggregate Reuse Principle,CARP)
系統中盡量使用組合和聚合的關系,而盡量少用甚至不用繼承關系。

7)迪米特法則(Law of Demeter, LoD)
一個軟件實體應當盡量少的與其他實體發生相互作用.
又叫做最少知道原則。也就是說一個對象應當對其他對象要盡可能少的了解,不要和陌生人說話。

在面向對象中的基本設計原則基礎上,又出現了各種各樣的設計模式,來解決同一種問題

5.4、面向對象設計模式

  1)GRASP模式:General Responsibility Assignment Software Patterns,通用責任分配軟件模式

2) GOF模式(四人幫設計模式):Erich Gamma, Richard Helm, Ralph Johnson,John Vlissides軟件設計領域的四位世界頂級大師.合著有《設計模式:可復用面向對象軟件的基礎》,

提出了23種基本設計模式,從理論高度提煉並規範了設計模式,對面向對象設計,軟件復用領域產生了巨大影響。

OOAD-設計模式(一)概述