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

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對象的一部分,合成則是一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣

 

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

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

 

 

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

 

 

二十三 命令模式

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

 

 

二十四 職責鏈模式

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

 

二十五 中介者模式

 

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

 

優缺點:

缺點:多對多交互複雜的對象羣時,不要急於使用這個模式

優點:減少耦合

場景:

一般應用於一組對象以定義良好但是複雜的方式進行通信的場合

 

 

 

二十六 享元模式

運用共享技術有效地支持大量細粒度的對象

 

 

二十七 解釋器模式

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

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

 

 

二十八 訪問者模式

 

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

 

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