所有的設計模式都是為了解決變化的問題,通過一定的模式來應對變化,變化應對的原則是開放封閉原則,對修改封閉,對擴充套件開放。
為了應對變化,就會新增相應的層次,層次越多,**的顆粒就越小,那麼**就越複雜。
所以設計時考慮變化和複雜之間的取捨,為了應對變化 ,需要使用模式,但是又不可以一味應用模式,導致**太複雜。
應該是根據軟體可能的變化部分使用模式應對變化。
黎克特制代換原則:子型別必須能夠替換掉它的父型別,is a關係。
a 策略模式
現實模型:不同的實現部分,但是他們的對外介面是一樣的。
設計模式:抽象多一層,外部只呼叫基類,不呼叫具體的策略類。
b 合成模式
現實模型:資料是樹型結構,而且樹節點之間存在整體和部分的包含關係。
設計模式:將樹節點的樹枝和樹葉同等對待,他們具有一樣的基類。
這樣就可以很容易的生成任何型別樹結構。
c **模式
現實模型:外部希望訪問真實的物件,但是設計者因為各種原因,可能性能或者安全考慮,讓乙個**和外部打交道,我們現實也經常有**,委託某個人幫助實施部分功能。
設計模式:**和真實物件存在關聯,然後他們繼承一樣的基類,那麼就對外有統一的功能,
結論:黎克特制代換原則實現方法都是一樣的,就是繼承同樣的基類,然後外部通過和基類打交道,基類就是這個中間層次,只要基類不變化,那麼就可以儲存對外介面不變化。
通過新增基類,對修改封閉,對擴充套件開放。
上面3個現實的模型是不一樣的,策略之間對等關係,合成是整體和部分關係,但是把他們對等看待,**模式是關聯關係,但是對外他們是對等關係。
要是現實模型的ab不滿足黎克特制代換原則,就算b不is a a ,那麼這個時候如何解決他們的關係的呢?
a 新增 基類c,讓他們同時繼承c
正方形和長方形的例子,正方形不是長方形,通過引入c 四邊形解決。
b 繼承關係改為委派關係
依賴倒轉原則:a 高層不應該依賴低層,兩個都應該依賴抽象。
b 抽象不應該依賴細節,細節應該依賴抽象。
a 工廠方法
現實模型:外部需要呼叫乙個物件,需要new乙個物件,依賴於具體物件。
設計模式:新增乙個工廠類,將這個類的例項化延遲到之類,外部就是依賴抽象,而不依賴具體型別。
b 模板物件
設計模式:抽象公共部分為基類,定義介面虛函式,延遲到子類實現。
c 迭代器模式
現實模型:需要迭代功能。只是迭代的型別不一樣。
解決辦法:統一基類迭代器,具體迭代介面函式在具體子類實現。
依賴倒轉原則,建立類的時候要不依賴具體,那麼就要建立工廠類,麻煩。同時依賴倒轉假設具體類是被修改的也是不總正確的 ,所以就是要合理使用。
介面隔離原則:應該給客戶端提供盡可能小的介面,而不要提供大介面。
合成聚合復用原則:要盡量使用合成聚合,而不要使用繼承。
區分has-a 和is -a ,is -a 表示乙個類是另乙個類的一種。has-a表是某乙個角色具有某一項職責。
has-a用關聯,is-a用繼承。
迪公尺特法則:如果兩個類不必彼此直接通訊,那麼這兩個類就不應發生直接的相互作用,如果其中乙個類需要呼叫另乙個類的某個方法,就通過第三者**這個呼叫。
說白了就是模組化設計,高內聚,低耦合。
高內聚:單一職責原則。
低耦合:迪公尺特法則 介面隔離原則 依賴倒轉原則
目的是對修改封閉,對擴充套件開放。
**復用:封裝,繼承 。
通過抽象封裝,繼承,是**可以服用。
封裝的原則是:高內聚, 單一職責。
適應變化:多型機制,新增層次。
通過運用多型和新增**層,可以讓**適應變化。
層次的原則:低內聚,迪公尺特法則 介面隔離原則 依賴倒轉原則
軟體要易於維護和適應變化,乙個復用率好的系統就是乙個容易維護的系統,乙個適應變化的系統是對修改封閉對擴充套件開發的系統。
所以**設計的原則是復用和適應變化。
學習設計模式 原型設計模式
先想一下既然要建立新的例項,為什麼不直接使用 new 而要設計出乙個原型模式進行例項的複製呢?這是因為 有的時候,我們也會在不指定類名的前提下生成例項,例如像圖形編輯器中拖動現有的模型工具製作圖形的例項,這種是非常典型的生成例項的過程太過複雜,很難根據類來生成例項場景,因此需要根據現有的例項來生成新...
設計模式學習
知道設計模式已經很久了,但是一直沒有認真的去系統的學習,這幾天才開始逐漸的學習起來。下面是我學習設計模式的一些心得。要想成為一名優秀的軟體設計師或軟體架構設計師,了解一些設計模式是很有必要的。我認為學習設計模式的思路如下 一 基本概念 理解物件導向 理解重用等概念性的東西 1.什麼是物件導向?2.物...
設計模式學習
設計模式其實就是一種 思想 就像做菜,一開始學習的人難免會問 我現在學做了幾道菜?其實,真正的精髓不在菜品,而在如何調味,如何選料,備料等 最基本的原理和法則 掌握並熟練應運了這些基本思想,才能真正的完成從 無招 到 有招 再到 無招勝有招 的至深境界。建立型模式 設計模式學習筆記 singleto...