1. 程式人生 > >學習 《大話設計模式》筆記

學習 《大話設計模式》筆記

Java設計模式七大原則

1.開閉原則(Open Close Principle)

2.里氏代換原則(Liskov Substitution Principle)

3.依賴倒轉原則(Dependence Inversion Principle)

4.介面隔離原則(Interface Segregation Principle)

5.迪米特法則(Law Of Demeter)

6.單一職責原則(Single Responsibility Principle)

7.組合/聚合複用原則

https://blog.csdn.net/u011288271/article/details/52497602

一 簡單工廠模式

 

面向物件程式設計,讓程式碼變得容易維護,複用,擴充套件,靈活

例:活字印刷術: 喝酒唱歌,人生真爽 --> 對酒當歌,人生幾何

只改要改的字 -- 可維護

這些字可以在後面的印刷重複使用 --可複用

若要加字,另刻字即可 -- 可擴充套件

字的排列隨意 --靈活性好

通過封裝,繼承,多型 把程式的耦合度降低

 

1.8 業務的封裝: 讓業務邏輯和頁面邏輯分開

計算器實現加減乘除 寫一個方法GetResult 通過傳入數字和符號 進行運算

 

1.9 緊耦合 送耦合

如過要維護薪資管理系統程式碼 不能讓所有人都看到所以的程式碼 所以要實現加減乘除各一個方法 分別繼承運算類

 

1.10 簡單工廠模式

 

只需輸入符號 工廠就例項化出合適的物件,通過多型 返回父類的方式實現了計算器的結果

這樣的好處:1 如果有一天改加法運算,只需要改加法方法就可以

2 增加平方根 新增子類 switch加分支

 

 

1.11 UML類圖

矩形框 : 表示一個類

第一層 類名 (抽象是斜體)

第二層 類的特性 欄位和屬性

第三層 類的操作 方法和行為

+ public - private # protected

 

1.繼承關係用 空心三角形+實線表示

2.實現介面用空心三角形+虛線表示

3.當一個類知道另一個類時,可以用關聯關係 實現剪頭表示 如企鵝類需要引用到氣候

4.大雁屬於雁群 聚合關係(A包含B B不包含A) 用空心菱形+實心箭頭

5 鳥和翅膀就是合成(組合)關係 生命週期是相同的 實心菱形+實心箭頭

6 動物特徵需要有 氧氣 水 食物等 依賴關係 虛線箭頭

 

 

 

二 策略模式

1 商場收銀軟體

輸入單價 數量 算費用

1.0版 傳入單價 數量 輸出費用

2 增加打折

新增下拉框 可選擇折扣

3 新增滿300送100 而且還有打折

新增現金收費抽象類 : 實現打折子類,返利收費子類 在工廠類分析呼叫什麼方法

 

4 策略模式

定義了演算法家族,分別封裝 讓他們之間可以相互替換 此模式讓演算法的變法,不會影響到使用演算法的客戶

策略模式就是用來封裝演算法的,在實踐中 也可以用來封裝幾乎任何型別的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮室友策略模式處理這種變化的可能性

 

 

三 單一職責原則

單一職責原則SRP:就一個類而言,應該僅有一個引起它變化的原因

如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭到意想不到的破壞ASD

 

四 開放-封閉原則OCP

軟體實體(類,模組,函式等等) 應該可以擴充套件,但是不可修改

在我們最初編寫程式碼時,假設變化不會發生,當發生時,我們就建立抽象來隔離以後發生的同類變化

面對需求,對程式的改動是通過增加新程式碼進行的,而不是更改現有的程式碼。

 

 

五 依賴倒轉原則

要針對介面程式設計,不要對實現程式設計

A 高層模組不應該依賴低層模組,2個都應該依賴抽象

B 抽象不應該依賴細節,細節應該依賴抽象

里氏代換原則: 在軟體裡面,把父類都替換成它的子類,程式的行為沒有變化

只有當子類可以替換到父類,軟體單位的功能不受影響時,父類才能真正被複用,而子類也能夠在父類的基礎上增加新的行為

 

六 裝飾模式

動態地給一個物件增加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活

 

 

七 代理模式

為其物件提供一種代理以控制對這個物件的訪問

例子圖:

追求者 和 代理 都去實現送禮物的介面 代理類在實現方法中呼叫追求者類的相關方法

 

 

應用:

1 遠端代理 為一個物件在不同的地址空間提供區域性代表,這樣可以隱藏一個物件存在於不同地址空間的事實

2 虛擬代理 是根據需要建立開銷很大的物件,通過它來存放例項化需要很長時間的真實物件

3 安全代練 用來控制真是物件訪問時的許可權

4 智慧指引,是指當呼叫真實的物件時,代理處理另外一些事

 

 

 

八 工廠方法模式

簡單工廠模式和工廠模式區別

簡單工廠模式:

工廠模式:

簡單工廠模式的最大有點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴

但是如果想要加一個‘求M數的N次方’功能 需要跟運算工廠類方法加case分支條件 相當於不但對擴充套件開發了,對修改也開放了 這樣就違背了開放-封閉原則

 

工廠方法模式:定義一個使用者建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類

 

 

 

九 原型模式

在原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件

需要用到clone( )方法 和 MemberwiseClone()這個方法java裡好像沒有

 

淺複製 :被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用都仍然指向原來的物件

 

深複製 把引用物件的變數指向複製過的新物件,而不是原有的被引用的物件

 

 

十 模版方法模式

定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟

例:考試試卷

 

模版方法模式是通過把不變行為搬移到超類,去除子類中的重複程式碼來提現他的優勢

 

 

十一 迪米特法則

 

如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用,如果其中一個類需要呼叫另一個類的某一個方法的話,可以通過第三者轉發這個呼叫

 

迪米特法則其根本思想,是強調了類之間的鬆耦合,類之間的耦合越弱,越有利於複用,一個處在弱耦合的類被修改,不會對有關係的類造成波及

 

 

十二 外觀模式

 

為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用

什麼時候用?

首先,在設計初期階段,應該要有意識的將不同的兩個層分離,

其次,在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜

第三,在維護一個遺留大型系統時,可能這個系統已經非常難以維護和擴充套件時

 

 

 

十三 建造者模式

 

將一個複雜物件的構建與他的表示分離,使得同樣的構建過程可以建立不同的表示

 

 

建造者模式是在當建立複雜物件的演算法應該獨立於該物件的組成部分以及他們的裝配方式時適用的模式

 

 

十四 觀察者模式

事件委託說明

委託就是一種引用方法的型別,一旦為委託分配了方法,委託將與該方法具有完全相同的行為,委託方法的使用可以像其他任何方法一樣,具有引數和返回值,委託可以看作時對函式的抽象,是函式的‘類’,委託的例項將代表一個具體的函式

 

 

十五 抽象工廠模式

 

提供一個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類

優點:

1.易於交換產品,由於具體工廠類 在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置

2.讓具體的建立例項過程與客戶端分離,客戶端是通過他們的抽象介面操縱例項,產品的具體類名也被具體工廠的實現分離,不會出現在客戶程式碼中

 

 

反射技術:

Assembly.Load("程式集名稱").CreateInstance("名稱空間.類名稱")

 

//常規寫法

IUser result = new SqlserverUser();

//反射寫法

using System.Reflection; //先引用System.Reflection的名稱空間

IUser result =

(IUser)Assembly.Load("抽象工廠模式").CreateInstance("抽象工廠模式.SqlserverUser");

當前程式集名稱 當前名稱空間 要例項化的類名

 

以後想改資料庫只需要把字串SqlserverUser改成OracleUser就可以了

 

 

十六 狀態模式

狀態模式:當一個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類

 

目的:消除龐大的條件分支語句

什麼時候用:當一個物件的行為取決於他的狀態,並且他必須在執行時刻根據狀態改變他的行為時,就可以考慮使用狀態模式了

 

 

十七 適配者模式

將一個類的介面轉換成客戶希望的另外一個介面 Adapter模式使得原來由於介面不相容而不能一起工作的那個類可以一起工作

 

場景: 系統的資料和行為都正確,但介面不符時,我們應該考慮用介面卡,目的是使控制範圍之外的一個原有物件與某個介面匹配,介面卡模式主要應用於希望複用一些現存的類,但是介面又與複用環境要求不一致的情況

兩個類所做的事情相同或相似,但是具有不同的介面時要使用他,客戶程式碼可以統一呼叫同一介面

 

 

 

十八 備忘錄模式

 

備忘錄:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可以將該物件恢復到原先儲存的狀態(類似存檔讀檔)

 

 

十九 組合模式

 

組合模式:將物件組合成樹形結構以表示‘部分-整體’的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性

什麼時候使用:

 

需求中是體現部分與整體層次的結構時,以及你希望使用者可以忽略組合物件與單個物件的不同,統一的使用組合結構中的所有物件時,就應該考慮用組合模式了

 

 

 

二十 迭代器模式

 

提供一種方法順序訪問一個聚合物件中各個元素,而又不暴露該物件的內部表示

迭代器模式就是分離了集合物件的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部程式碼透明地訪問集合內部的資料

增強for迴圈

 

 

二十一 單例模式

 

單例模式:保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點

 

 

 

 

二十二 橋接模式

物件的繼承關係是在編譯時就定義好了,所以無法在執行時改變從父類繼承的實現,子類的實現與它的父類有非常緊密的依賴關係,以至於父類實現中的任何變化必然會導致子類發生變化。當你需要複用子類時,如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換,這種依賴關係限制了靈活性並最終限制了複用性

 

合成/聚合複用原則 : 儘量使用合成/聚合,儘量不要使用類繼承

聚合表示一種弱的擁有關係,提現的是A物件可以包含B物件,但B物件不是A物件的一部分,合成則是一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣

 

例: 大雁和翅膀 是部分和整體的關係 是合成關係

大雁屬於一個雁群,是聚合關係

 

 

橋接模式:將抽象部分與它的實現部分分離,使它們都可以獨立地變化

 

 

二十三 命令模式

將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤銷的操作

 

 

二十四 職責鏈模式

使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係,將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,知道有一個物件處理它為止

 

二十五 中介者模式

 

用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯式地相互作用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動

 

優缺點:

缺點:多對多互動複雜的物件群時,不要急於使用這個模式

優點:減少耦合

場景:

一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合

 

 

 

二十六 享元模式

運用共享技術有效地支援大量細粒度的物件

 

 

二十七 直譯器模式

給定一個語言,定義它的文法的一種表示,並定義一個直譯器,這個直譯器使用該表示來解釋語音中的句子

如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為一個簡單語言中的句子,這樣就可以構建一個直譯器,該直譯器通過解釋這些句子來解決該問題

 

 

二十八 訪問者模式

 

表示一個作用於某物件結構中的各元素的操作,它使你可以在不改變各元素的類前提下定義作用於這些元素的新操作