【软件构造】(转) 设计模式
設(shè)計(jì)模式
? 在課程中,我們陸續(xù)學(xué)習(xí)了全部的24種設(shè)計(jì)模式,在實(shí)驗(yàn)中也用到了工廠模式、抽象工廠模式、策略模式等內(nèi)容;在課程的考試中,我們也將使用制定的設(shè)計(jì)模式對(duì)代碼進(jìn)行優(yōu)化,為了更好的理解設(shè)計(jì)模式,轉(zhuǎn)發(fā)本篇斯認(rèn)為質(zhì)量較好的博文,希望能對(duì)設(shè)計(jì)模式有更明晰的認(rèn)識(shí)。
轉(zhuǎn)自:?設(shè)計(jì)模式大雜燴(24種設(shè)計(jì)模式的總結(jié)以及學(xué)習(xí)設(shè)計(jì)模式的幾點(diǎn)建議)? 作者:zuoxiaolong8810(左瀟龍),轉(zhuǎn)載請(qǐng)注明出處。
? ? ? ? ?迄今為止,LZ已經(jīng)將24種設(shè)計(jì)模式介紹完了,其中包括GOF23種設(shè)計(jì)模式以及簡(jiǎn)單工廠模式,這些設(shè)計(jì)模式之間并不是完全獨(dú)立的,而是互相之間,會(huì)有一些相同的影子,下面我們來(lái)一起總結(jié)下這24種設(shè)計(jì)模式。
?
模式分類 & 傳送門 & 對(duì)比維度說(shuō)明
- 設(shè)計(jì)原則:??設(shè)計(jì)模式(總綱)?
- 創(chuàng)建型:??單例模式? ?簡(jiǎn)單工廠模式? ?工廠方法模式? ?抽象工廠模式??建造者模式??原型模式
- 結(jié)構(gòu)型:??代理模式? ?適配器模式? ?裝飾器模式? ?橋接模式? ?組合模式? ?享元模式??外觀模式?
- 行為型: ?觀察者模式? ?模板方法模式? ?命令模式? ?狀態(tài)模式? ?職責(zé)鏈模式? ?解釋器模式? ?中介者模式? ?訪問者模式? ?策略模式??備忘錄模式??迭代器模式
?
? ? ? ? 以上便是設(shè)計(jì)模式的分類以及各個(gè)模式的傳送門,可以看到其中行為型模式的個(gè)數(shù)為最多,結(jié)構(gòu)型次之,創(chuàng)建型設(shè)計(jì)模式最少。
? ? ? ? 在寫這篇文章的時(shí)候,LZ考慮的最多的一個(gè)問題就是,從哪幾個(gè)維度去對(duì)比設(shè)計(jì)模式能讓大家更加清楚的看出各個(gè)設(shè)計(jì)模式的區(qū)別與聯(lián)系,思來(lái)想去,LZ決定從以下幾個(gè)維度去對(duì)比設(shè)計(jì)模式。
?
- 設(shè)計(jì)原則:描述每個(gè)設(shè)計(jì)模式都遵循了哪些設(shè)計(jì)原則,破壞了哪些設(shè)計(jì)原則。
- 常用場(chǎng)景:描述各個(gè)設(shè)計(jì)模式大部分情況下,都會(huì)在哪些場(chǎng)景下出現(xiàn)。
- 使用概率:主要指在普遍的工作當(dāng)中,該設(shè)計(jì)模式出現(xiàn)的頻率,若是類庫(kù)或是開源框架提供的功能中包含該模式,則也會(huì)計(jì)算其頻率。
- 復(fù)雜度:特指一個(gè)設(shè)計(jì)模式在實(shí)現(xiàn)的時(shí)候的復(fù)雜度,主要的衡量標(biāo)準(zhǔn)是類的數(shù)量、類之間的耦合關(guān)系。
- 變化點(diǎn):設(shè)計(jì)模式很大的一個(gè)意義在于容納變化,掌握一個(gè)設(shè)計(jì)模式的變化點(diǎn)是非常重要的一件事。
- 選擇關(guān)鍵點(diǎn):當(dāng)選擇使用一個(gè)設(shè)計(jì)模式的時(shí)候,指出最關(guān)鍵的選擇點(diǎn)在哪里。
- 逆鱗:龍有逆鱗,不可觸摸,同樣的,設(shè)計(jì)模式也有逆鱗,有些地方是不能碰的。
- 相關(guān)設(shè)計(jì)模式:與其它設(shè)計(jì)模式的關(guān)系。
?
創(chuàng)建型設(shè)計(jì)模式
單例模式(Singleton Pattern 8-3)
- 設(shè)計(jì)原則:無(wú)
- 常用場(chǎng)景:應(yīng)用中有對(duì)象需要是全局的且唯一
- 使用概率:99.99999%
- 復(fù)雜度:低
- 變化點(diǎn):無(wú)
- 選擇關(guān)鍵點(diǎn):一個(gè)對(duì)象在應(yīng)用中出現(xiàn)多個(gè)實(shí)例是否會(huì)引起邏輯上或者是程序上的錯(cuò)誤
- 逆鱗:在以為是單例的情況下,卻產(chǎn)生了多個(gè)實(shí)例
- 相關(guān)設(shè)計(jì)模式
- 原型模式:單例模式是只有一個(gè)實(shí)例,原型模式每拷貝一次都會(huì)創(chuàng)造一個(gè)新的實(shí)例。
簡(jiǎn)單工廠模式
- 設(shè)計(jì)原則:遵循單一職責(zé)、違背開閉原則
- 常用場(chǎng)景:需要在一堆產(chǎn)品中選擇其中一個(gè)產(chǎn)品
- 使用概率:99.99999%
- 復(fù)雜度:低
- 變化點(diǎn):產(chǎn)品的種類
- 選擇關(guān)鍵點(diǎn):一種產(chǎn)品是否可根據(jù)某個(gè)參數(shù)決定它的種類
- 逆鱗:工廠類不能正常工作
- 相關(guān)設(shè)計(jì)模式
- 工廠方法模式:工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象化,在這兩者之間做選擇,主要看將工廠進(jìn)一步抽象化是否有必要,通常情況下,如果工廠的作用僅僅是用來(lái)制造產(chǎn)品,則沒必要使用工廠方法模式。
工廠方法模式(Factory Pattern 6-2)
- 設(shè)計(jì)原則:遵循單一職責(zé)、依賴倒置、開閉原則
- 常用場(chǎng)景:一種場(chǎng)景是希望工廠與產(chǎn)品的種類對(duì)客戶端保持透明,給客戶端提供一致的操作,另外一種是不同的工廠和產(chǎn)品可以提供客戶端不同的服務(wù)或功能
- 使用概率:60%
- 復(fù)雜度:中低
- 變化點(diǎn):工廠與產(chǎn)品的種類
- 選擇關(guān)鍵點(diǎn):工廠類和產(chǎn)品類是否是同生同滅的關(guān)系
- 逆鱗:無(wú)
- 相關(guān)設(shè)計(jì)模式
- 抽象工廠模式:工廠方法模式與抽象工廠模式最大的區(qū)別在于,在工廠方法模式中,工廠創(chuàng)造的是一個(gè)產(chǎn)品,而在抽象工廠模式中,工廠創(chuàng)造的是一個(gè)產(chǎn)品族。
抽象工廠模式(Abstract Factory Pattern 6-2)
- 設(shè)計(jì)原則:遵循單一職責(zé)、依賴倒置、開閉原則
- 常用場(chǎng)景:需要一個(gè)接口可以提供一個(gè)產(chǎn)品族,且不必知道產(chǎn)品的具體種類
- 使用概率:30%
- 復(fù)雜度:中
- 變化點(diǎn):工廠與產(chǎn)品的種類
- 選擇關(guān)鍵點(diǎn):產(chǎn)品族是否需要一起提供,且是否有一致的接口
- 逆鱗:無(wú)
- 相關(guān)設(shè)計(jì)模式
- 建造者模式:兩者都是建造一批對(duì)象或者說(shuō)產(chǎn)品,不同的是兩者的目的和實(shí)現(xiàn)手段,在建造者模式中,是為了復(fù)用對(duì)象的構(gòu)建過(guò)程而定義了一個(gè)指揮者,而在抽象工廠模式中,是為了提供一個(gè)這批對(duì)象的創(chuàng)建接口而定義了抽象工廠接口。
建造者模式(Builder Pattern 6-2)
- 設(shè)計(jì)原則:遵循單一職責(zé)、開閉原則
- 常用場(chǎng)景:需要構(gòu)建一批構(gòu)建過(guò)程相同但表示不同的產(chǎn)品,而構(gòu)建過(guò)程非常復(fù)雜
- 使用概率:10%
- 復(fù)雜度:中
- 變化點(diǎn):產(chǎn)品的表示
- 選擇關(guān)鍵點(diǎn):各個(gè)產(chǎn)品的構(gòu)建過(guò)程是否相同
- 逆鱗:指揮者不能正常工作
原型模式(Prototype Pattern 8-3)
- 設(shè)計(jì)原則:無(wú)
- 常用場(chǎng)景:需要在運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建指定實(shí)例種類的對(duì)象,或是需要復(fù)用其狀態(tài)
- 使用概率:10%
- 復(fù)雜度:中低
- 變化點(diǎn):無(wú)
- 選擇關(guān)鍵點(diǎn):創(chuàng)建出來(lái)的對(duì)象是否可以立即投入使用
- 逆鱗:在以為是深度拷貝的情況下,卻未實(shí)現(xiàn)深度拷貝
?
?
結(jié)構(gòu)型設(shè)計(jì)模式
代理模式(Proxy Pattern 6-2)
- 設(shè)計(jì)原則:體現(xiàn)功能復(fù)用
- 常用場(chǎng)景:需要修改或屏蔽某一個(gè)或若干個(gè)類的部分功能,復(fù)用另外一部分功能,可使用靜態(tài)代理,若是需要攔截一批類中的某些方法,在方法的前后插入一些一致的操作,假設(shè)這些類有一致的接口,可使用JDK的動(dòng)態(tài)代理,否則可使用cglib
- 使用概率:99.99999%
- 復(fù)雜度:中高
- 變化點(diǎn):靜態(tài)代理沒有變化點(diǎn),動(dòng)態(tài)代理的變化點(diǎn)為具有相同切入點(diǎn)的類
- 選擇關(guān)鍵點(diǎn):靜態(tài)代理選擇的關(guān)鍵點(diǎn)是是否要復(fù)用被代理的部分功能,動(dòng)態(tài)代理選擇的關(guān)鍵點(diǎn)在于能否在將被代理的這一批類當(dāng)中,找出相同的切入點(diǎn)
- 逆鱗:切入點(diǎn)的不穩(wěn)定
- 相關(guān)設(shè)計(jì)模式
- 適配器模式:對(duì)于適配器模式當(dāng)中的定制適配器,它與靜態(tài)代理有著相似的部分,二者都有復(fù)用功能的作用,不同的是,靜態(tài)代理會(huì)修改一部分原有的功能,而適配器往往是全部復(fù)用,而且在復(fù)用的同時(shí),適配器還會(huì)將復(fù)用的類適配一個(gè)接口
適配器模式(Adapter 5-3)
- 設(shè)計(jì)原則:遵循開閉原則、體現(xiàn)功能復(fù)用
- 常用場(chǎng)景:需要使用一個(gè)類的功能,但是該類的接口不符合使用場(chǎng)合要求的接口,可使用定制適配器,又或者是有一個(gè)接口定義的行為過(guò)多,則可以定義一個(gè)缺省適配器,讓子類選擇性的覆蓋適配器的方法
- 使用概率:40%
- 復(fù)雜度:中
- 變化點(diǎn):無(wú)
- 選擇關(guān)鍵點(diǎn):定制適配器的選擇關(guān)鍵點(diǎn)在于是否有更加優(yōu)良的替代方案,缺省適配器的選擇關(guān)鍵點(diǎn)在于接口中的方法是否可以不全部提供,且都有缺省方案
- 逆鱗:無(wú)
- 相關(guān)設(shè)計(jì)模式
- 裝飾器模式:對(duì)于適配器模式中的定制適配器與裝飾器模式,二者都是使用組合加繼承的手段,不同的是,適配器模式的目的在于適配接口,裝飾器模式的目的在于動(dòng)態(tài)的添加功能,且可以疊加。
裝飾器模式(Decorator 5-3)
- 設(shè)計(jì)原則:遵循迪米特、單一職責(zé)、開閉原則,破壞里氏替換,體現(xiàn)功能復(fù)用
- 常用場(chǎng)景:一個(gè)類需要?jiǎng)討B(tài)的添加功能,且這些功能可以相互疊加
- 使用概率:99.99999%
- 復(fù)雜度:中
- 變化點(diǎn):動(dòng)態(tài)添加的功能或者說(shuō)裝飾器
- 選擇關(guān)鍵點(diǎn):添加的功能是否需要?jiǎng)討B(tài)組裝
- 逆鱗:無(wú)
橋接模式(Bridge Pattern 6-2)
- 設(shè)計(jì)原則:遵循單一職責(zé)、迪米特、開閉原則,體現(xiàn)功能復(fù)用
- 常用場(chǎng)景:一個(gè)對(duì)象有多個(gè)維度的變化,需要將這些維度抽離出來(lái),讓其獨(dú)立變化
- 使用概率:20%
- 復(fù)雜度:中高
- 變化點(diǎn):維度的擴(kuò)展與增加
- 選擇關(guān)鍵點(diǎn):是否可以將對(duì)象拆分成多個(gè)不相關(guān)的維度
- 逆鱗:無(wú)
組合模式(Composite Pattern 6-2)
- 設(shè)計(jì)原則:遵循依賴倒置、開閉原則,破壞接口隔離
- 常用場(chǎng)景:當(dāng)有一個(gè)結(jié)構(gòu)可以組合成樹形結(jié)構(gòu),且需要向客戶端提供一致的操作接口,使得客戶端操作忽略簡(jiǎn)單元素與復(fù)雜元素
- 使用概率:30%
- 復(fù)雜度:中
- 變化點(diǎn):節(jié)點(diǎn)的數(shù)量
- 選擇關(guān)鍵點(diǎn):對(duì)外提供一致操作接口的結(jié)構(gòu)是否可轉(zhuǎn)化為樹形結(jié)構(gòu)
- 逆鱗:結(jié)構(gòu)不穩(wěn)定或結(jié)構(gòu)中的節(jié)點(diǎn)有遞歸關(guān)系
享元模式(Flyweight Pattern 8-3)
- 設(shè)計(jì)原則:無(wú)
- 常用場(chǎng)景:一些狀態(tài)相同的對(duì)象被大量的重復(fù)使用
- 使用概率:90%
- 復(fù)雜度:中
- 變化點(diǎn):無(wú)
- 選擇關(guān)鍵點(diǎn):被共享的對(duì)象是否可以將外部狀態(tài)提取出來(lái)
- 逆鱗:沒有將外部狀態(tài)提取完全
外觀模式(Facade 5-3)
- 設(shè)計(jì)原則:遵循迪米特
- 常用場(chǎng)景:一個(gè)子系統(tǒng)需要對(duì)外提供服務(wù)
- 使用概率:60%
- 復(fù)雜度:中
- 變化點(diǎn):無(wú)
- 選擇關(guān)鍵點(diǎn):子系統(tǒng)對(duì)外提供服務(wù)是否需要依賴很多的類
- 逆鱗:子系統(tǒng)對(duì)外提供的服務(wù)的變化或子系統(tǒng)本身的不穩(wěn)定
- 相關(guān)設(shè)計(jì)模式
- 中介者模式:二者都是為了處理復(fù)雜的耦合關(guān)系,不同的是外觀模式處理的是類之間復(fù)雜的依賴關(guān)系,中介者模式處理的是對(duì)象之間復(fù)雜的交互關(guān)系
?
行為型設(shè)計(jì)模式
觀察者模式(Observer Pattern 6-2)
- 設(shè)計(jì)原則:遵循迪米特、開閉原則
- 常用場(chǎng)景:需要將觀察者與被觀察者解耦或者是觀察者的種類不確定
- 使用概率:40%
- 復(fù)雜度:中
- 變化點(diǎn):觀察者的種類與個(gè)數(shù)
- 選擇關(guān)鍵點(diǎn):觀察者與被觀察者是否是多對(duì)一的關(guān)系
- 逆鱗:觀察者之間有過(guò)多的細(xì)節(jié)依賴
模板方法模式(Template method 5-3)
- 設(shè)計(jì)原則:破壞里氏替換,體現(xiàn)功能復(fù)用
- 常用場(chǎng)景:一批子類的功能有可提取的公共算法骨架
- 使用概率:80%
- 復(fù)雜度:中低
- 變化點(diǎn):算法骨架內(nèi)各個(gè)步驟的具體實(shí)現(xiàn)
- 選擇關(guān)鍵點(diǎn):算法骨架是否牢固
- 逆鱗:無(wú)
命令模式(Command Pattern 6-2)
- 設(shè)計(jì)原則:遵循迪米特、開閉原則
- 常用場(chǎng)景:行為的請(qǐng)求者與行為的處理者耦合度過(guò)高
- 使用概率:20%
- 復(fù)雜度:中高
- 變化點(diǎn):命令的種類
- 選擇關(guān)鍵點(diǎn):請(qǐng)求者是否不需要關(guān)心命令的執(zhí)行只知道接受者
- 逆鱗:命令的種類無(wú)限制增長(zhǎng)
- 相關(guān)設(shè)計(jì)模式
- 職責(zé)鏈模式:容易將二者關(guān)聯(lián)在一起的原因是,二者都是為了處理請(qǐng)求或者命令而存在的,而且二者都是為了將請(qǐng)求者與響應(yīng)者解耦,不同的是命令模式中,客戶端需要知道一個(gè)命令的接受者,在創(chuàng)建命令的時(shí)候就把接受者與命令綁定在一起發(fā)送給調(diào)用者,而職責(zé)鏈模式中,客戶端并不關(guān)心最終處理請(qǐng)求的對(duì)象是誰(shuí),客戶端只是封裝一個(gè)請(qǐng)求對(duì)象,隨后交給職責(zé)鏈的頭部而已,也正因?yàn)檫@樣,二者的實(shí)現(xiàn)方式,有著很大的區(qū)別
狀態(tài)模式(State Pattern 6-3)
- 設(shè)計(jì)原則:遵循單一職責(zé)、依賴倒置、開閉原則
- 常用場(chǎng)景:一個(gè)對(duì)象在多個(gè)狀態(tài)下行為不同,且這些狀態(tài)可互相轉(zhuǎn)換
- 使用概率:20%
- 復(fù)雜度:中
- 變化點(diǎn):狀態(tài)的種類
- 選擇關(guān)鍵點(diǎn):這些狀態(tài)是否經(jīng)常在運(yùn)行時(shí)需要在不同的動(dòng)態(tài)之間相互轉(zhuǎn)換
- 逆鱗:無(wú)
- 相關(guān)設(shè)計(jì)模式
- 策略模式:二者的實(shí)現(xiàn)方式非常相似,策略接口與狀態(tài)接口,具體的策略與具體的狀態(tài)以及二者都擁有的上下文,如果看它們的類圖,會(huì)發(fā)現(xiàn)幾乎一模一樣,而二者不同的地方就在于,狀態(tài)模式經(jīng)常會(huì)在處理請(qǐng)求的過(guò)程中更改上下文的狀態(tài),而策略模式只是按照不同的算法處理算法邏輯,而且從實(shí)際場(chǎng)景來(lái)講,顧名思義,狀態(tài)模式改變的是狀態(tài),策略模式改變的是策略
職責(zé)鏈模式(Chain of Responsibility Pattern 6-2)
- 設(shè)計(jì)原則:遵循迪米特
- 常用場(chǎng)景:一個(gè)請(qǐng)求的處理需要多個(gè)對(duì)象當(dāng)中的一個(gè)或幾個(gè)協(xié)作處理
- 使用概率:15%
- 復(fù)雜度:中
- 變化點(diǎn):處理鏈的長(zhǎng)度與次序
- 選擇關(guān)鍵點(diǎn):對(duì)于每一次請(qǐng)求是否每個(gè)處理的對(duì)象都需要一次處理機(jī)會(huì)
- 逆鱗:無(wú)
解釋器模式
- 設(shè)計(jì)原則:遵循單一職責(zé)
- 常用場(chǎng)景:有一種語(yǔ)言被頻繁的使用
- 使用概率:0.00009%
- 復(fù)雜度:中高
- 變化點(diǎn):語(yǔ)言的規(guī)則
- 選擇關(guān)鍵點(diǎn):被頻繁使用的語(yǔ)言是否可用文法表示
- 逆鱗:語(yǔ)言的規(guī)則無(wú)限制增長(zhǎng)或規(guī)則十分不穩(wěn)定
中介者模式(Mediator Pattern 6-2)
- 設(shè)計(jì)原則:遵循迪米特,破壞單一職責(zé)
- 常用場(chǎng)景:一個(gè)系列的對(duì)象交互關(guān)系十分復(fù)雜
- 使用概率:10%
- 復(fù)雜度:中
- 變化點(diǎn):對(duì)象之間的交互
- 選擇關(guān)鍵點(diǎn):復(fù)雜的交互關(guān)系是否有共性可被中介者承擔(dān)
- 逆鱗:中介者無(wú)法工作
訪問者模式(Visitor Pattern 6-2)
- 設(shè)計(jì)原則:遵循傾斜的開閉原則
- 常用場(chǎng)景:作用于一個(gè)數(shù)據(jù)結(jié)構(gòu)之上的操作經(jīng)常變化
- 使用概率:5%
- 復(fù)雜度:高
- 變化點(diǎn):數(shù)據(jù)結(jié)構(gòu)之上的操作
- 選擇關(guān)鍵點(diǎn):數(shù)據(jù)結(jié)構(gòu)是否穩(wěn)定以及操作是否經(jīng)常變化
- 逆鱗:數(shù)據(jù)結(jié)構(gòu)的不穩(wěn)定
策略模式(Strategy 5-3)
- 設(shè)計(jì)原則:遵循單一職責(zé)、依賴倒置、迪米特、開閉原則
- 常用場(chǎng)景:算法或者策略需要經(jīng)常替換
- 使用概率:60%
- 復(fù)雜度:中
- 變化點(diǎn):策略的種類
- 選擇關(guān)鍵點(diǎn):客戶端是否依賴于某一個(gè)或若干個(gè)具體的策略
- 逆鱗:無(wú)
備忘錄模式(Memento Pattern 6-3)
- 設(shè)計(jì)原則:遵循迪米特、開閉原則
- 常用場(chǎng)景:需要在對(duì)象的外部保存該對(duì)象的內(nèi)部狀態(tài)
- 使用概率:5%
- 復(fù)雜度:中
- 變化點(diǎn):無(wú)
- 選擇關(guān)鍵點(diǎn):是否可以在必要的時(shí)候捕捉到對(duì)象的內(nèi)部狀態(tài)
- 逆鱗:大對(duì)象的備份
迭代器模式( Iterator 5-3)
- 設(shè)計(jì)原則:遵循迪米特
- 常用場(chǎng)景:需要迭代訪問一個(gè)聚合對(duì)象中的各個(gè)元素,且不暴露該聚合對(duì)象內(nèi)部的表示
- 使用概率:99.99999%
- 復(fù)雜度:中
- 變化點(diǎn):聚合對(duì)象的種類
- 選擇關(guān)鍵點(diǎn):客戶端是否關(guān)心遍歷的次序
- 逆鱗:無(wú)
- 相關(guān)設(shè)計(jì)模式
- 訪問者模式:二者都是迭代的訪問一個(gè)聚合對(duì)象中的各個(gè)元素,不同的是,訪問者模式中,擴(kuò)展開放的部分在作用于對(duì)象的操作上,而迭代器模式中,擴(kuò)展開放的部分在聚合對(duì)象的種類上,而且二者的實(shí)現(xiàn)方式也有著很大的區(qū)別。
?
結(jié)束語(yǔ)
? ? ? ? 以上便是24種設(shè)計(jì)模式的各個(gè)特點(diǎn)與部分模式的對(duì)比,如果總結(jié)的過(guò)程當(dāng)中有疏漏或是錯(cuò)誤,請(qǐng)各位不吝賜教,LZ感激不盡。
? ? ? ? 此外需要說(shuō)明的是,上面的概率當(dāng)中有的會(huì)出現(xiàn)99.99999%這樣的數(shù)字,這是因?yàn)檫@個(gè)模式已經(jīng)嵌入到JAVA類庫(kù)或是我們常用的開源框架當(dāng)中(標(biāo)注一下:LZ總結(jié)的主要針對(duì)WEB開發(fā),android的開發(fā)LZ并未接觸過(guò),所以不包括在此列),比如迭代器模式,只要你使用過(guò)ArrayList或者HashSet,LZ就認(rèn)為這個(gè)模式被使用。這個(gè)使用頻率從某種意義上講,可以認(rèn)為是該模式的重要程度,當(dāng)然由于這個(gè)頻率是LZ制定的,所以僅代表個(gè)人觀點(diǎn)。
? ? ? ? 這里再針對(duì)設(shè)計(jì)模式的學(xué)習(xí),給各位提一點(diǎn)點(diǎn)建議,僅供參考,請(qǐng)各位吸優(yōu)排差,次序不分先后。
? ? ? ? 1、之前說(shuō)過(guò),學(xué)習(xí)設(shè)計(jì)模式除了努力之外還要靠緣分,所以如果有設(shè)計(jì)模式當(dāng)時(shí)怎么看都不明白,可以暫且放下,之后說(shuō)不定哪天你突然之間就明白了。(此話并非虛言,LZ很多次的頓悟常發(fā)生在上廁所、洗澡、回家路上等一些學(xué)習(xí)之外的時(shí)候。)
? ? ? ? 2、對(duì)于已經(jīng)在工作的人來(lái)說(shuō),可以常思考一下,有沒有哪個(gè)設(shè)計(jì)模式可以改善現(xiàn)有的系統(tǒng)架構(gòu),但不要輕易付諸實(shí)踐。
? ? ? ? 3、學(xué)習(xí)設(shè)計(jì)模式之前,一定要先整明白UML類圖,什么關(guān)聯(lián),依賴,聚合,組合等等都得搞明白兒的,否則學(xué)習(xí)起來(lái)也依然會(huì)很吃力。
? ? ? ? 4、對(duì)于初學(xué)者,一定要在弄清楚標(biāo)準(zhǔn)的實(shí)現(xiàn)代碼之后,寫一個(gè)屬于自己的例子,哪怕是比葫蘆畫瓢,然后仔細(xì)體會(huì)設(shè)計(jì)模式使用前后的差異,主要從擴(kuò)展性和類(類包括客戶端,而不僅僅指設(shè)計(jì)模式中的角色)的職責(zé)兩個(gè)方面。
? ? ? ? 5、一定要將設(shè)計(jì)模式的變化點(diǎn)搞清楚,這點(diǎn)非常重要,甚至重要程度高于設(shè)計(jì)模式的場(chǎng)景、實(shí)現(xiàn)方式以及類和對(duì)象之間的耦合關(guān)系,很多時(shí)候,設(shè)計(jì)模式的濫用就是因?yàn)樽兓c(diǎn)沒搞清楚,以至于該變化的沒變化,不該變化的經(jīng)常變化,增加系統(tǒng)的負(fù)擔(dān)。
? ? ? ? 6、設(shè)計(jì)模式不是一次性學(xué)習(xí)完就可以扔掉不看的東西,而是要經(jīng)?;剡^(guò)頭來(lái)看看,說(shuō)不定每一次你都有不一樣的體會(huì),而且一般情況下,這些體會(huì)會(huì)越來(lái)越深刻,越來(lái)越透徹。
? ? ? ? 7、如果可能的話,多研究一些開源框架,去找找它們里面的設(shè)計(jì)模式。
? ? ? ? LZ暫時(shí)也就只能想到這些,如果以后有想到再補(bǔ)充吧,各位如果有什么好的建議也可以與LZ分享一下。
? ? ? ? 到此為止,整個(gè)設(shè)計(jì)模式系列就真真正正的徹底結(jié)束了,當(dāng)初寫的時(shí)候也沒想到自己可以真的堅(jiān)持下來(lái),雖說(shuō)整整26篇文章不算多,但是LZ確實(shí)花費(fèi)了大量的時(shí)間和精力,值得欣慰的是LZ本人也得到了巨大的收獲,不僅僅是對(duì)設(shè)計(jì)模式的理解日益加深,而且還得了不少猿友的支持,讓LZ對(duì)分享這一道路更加堅(jiān)定。
? ? ? ? 以后的編程之路還很長(zhǎng),對(duì)于LZ來(lái)說(shuō),編程并不僅僅是工作,而是一份事業(yè),它給了LZ榮譽(yù)、金錢、成就感等等很多東西,希望各位至少在年輕的時(shí)候不要被一些悲觀化的觀點(diǎn)所干擾,特別是對(duì)編程有著熱愛的猿友們,極致才能成就大道,但凡在一個(gè)領(lǐng)域有所成就者,大都是鉆研了數(shù)十年的成果。
? ? ? ? 當(dāng)然,人各有志,LZ無(wú)法左右他人,但LZ已經(jīng)決定了自己的路,學(xué)火影里鳴人的一句話,“這就是我的忍道?!?/p>
轉(zhuǎn)載于:https://www.cnblogs.com/hithongming/p/9211148.html
總結(jié)
以上是生活随笔為你收集整理的【软件构造】(转) 设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DevExpress v18.1新版亮点
- 下一篇: asp.net ajax控件工具集 Au