C++ 面向?qū)ο笤O(shè)計(jì)
- 封裝:隱藏內(nèi)部實(shí)現(xiàn)
- 繼承:復(fù)用現(xiàn)有代碼
- 多態(tài):改寫對象行為
設(shè)計(jì)模式關(guān)鍵在于分解和抽象;
設(shè)計(jì)模式的主要目的是易于變化
面向?qū)ο笤O(shè)計(jì)原則–比設(shè)計(jì)模式更加重要 違背了設(shè)計(jì)原則,設(shè)計(jì)模式是錯(cuò)誤的。
- 依賴倒置原則(DIP)
- 開放封閉原則(OCP)
- 單一職責(zé)原則(SRP)
工廠方法模式
模式定義
工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。
模式結(jié)構(gòu)和時(shí)序圖
- Product:抽象產(chǎn)品
- ConcreteProduct:具體產(chǎn)品
- Factory:抽象工廠
- ConcreteFactory:具體工廠
模式結(jié)構(gòu):
工廠方法模式的優(yōu)點(diǎn)
- 工廠無需關(guān)心細(xì)節(jié),甚至無序知道具體產(chǎn)品的類名稱。
- 工廠角色和茶農(nóng)角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能確定創(chuàng)建的產(chǎn)品對象;創(chuàng)建細(xì)節(jié)完全封裝在具體工廠內(nèi)部。所有的具體工廠類都具有同一抽象父類。
- 添加新產(chǎn)品時(shí),只需要添加一個(gè)具體的工廠和具體產(chǎn)品就可以了,系統(tǒng)的擴(kuò)展性較好,完全符合”開閉原則”。
工廠模式的缺點(diǎn)
- 添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,而且需要提供與之賭贏的工廠類,系統(tǒng)中類的個(gè)數(shù)將成對增加,會(huì)帶來額外的編譯開銷。
- 由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。
單例模式
模式定義
單例模式(Singleton Pattern):單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類稱為單例類,它提供全局訪問的方法。
單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。單例模式是一種對象創(chuàng)建型模式。單例模式又名單件模式或單態(tài)模式。
模式分析
單例模式的目的是保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。單例類擁有一個(gè)私有構(gòu)造函數(shù),確保用戶無法通過new關(guān)鍵字直接實(shí)例化它。除此之外,該模式中包含一個(gè)靜態(tài)私有成員變量與靜態(tài)公有的工廠方法,該工廠方法負(fù)責(zé)檢驗(yàn)實(shí)例的存在性并實(shí)例化自己,然后存儲(chǔ)在靜態(tài)成員變量中,以確保只有一個(gè)實(shí)例被創(chuàng)建。
在單例模式的實(shí)現(xiàn)過程中,需要注意如下三點(diǎn):
- 單例類的構(gòu)造函數(shù)為私有;
- 提供一個(gè)自身的靜態(tài)私有成員變量;
- 提供一個(gè)公有的靜態(tài)工廠方法。
優(yōu)點(diǎn)
- 提供了對唯一實(shí)例的受控訪問。
- 允許可變數(shù)目的實(shí)例。
缺點(diǎn)
- 由于單例模式中沒有抽象層,因此單例類的擴(kuò)展有很大的困難。
- 單例類的職責(zé)過重,在一定程度上違背了“單一職責(zé)原則”。
適用環(huán)境
- 系統(tǒng)只需要一個(gè)實(shí)例對象,如系統(tǒng)要求提供一個(gè)唯一的序列號生成器,或者需要考慮資源消耗太大而只允許創(chuàng)建一個(gè)對象。
觀察者模式
上述模式中,需要使用明顯的調(diào)用函數(shù),來進(jìn)行兩個(gè)對象之間的通信,但是能否建立一種關(guān)系,使得一個(gè)對象發(fā)生改變時(shí),自動(dòng)通知其它對象,做出反映。這種模式就是觀察者模式
模式定義
觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關(guān)系,使得每當(dāng)一個(gè)對象狀態(tài)發(fā)生改變時(shí),其相關(guān)依賴對象皆得到通知并被自動(dòng)更新。觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式。
觀察者模式是一種對象行為型模式。
模式結(jié)構(gòu)
觀察者模式包含如下角色:
- Subject: 目標(biāo)主題:跟蹤所有觀察者,并提供添加和刪除觀察者的接口。
- ConcreteSubject: 具體目標(biāo);將有關(guān)狀態(tài)存入各 ConcreteObserver 對象。當(dāng)具體主題的狀態(tài)發(fā)生任何更改時(shí),通知所有觀察者。
- Observer: 觀察者:為所有的具體觀察者定義一個(gè)接口,在得到主題的通知時(shí)進(jìn)行自我更新。
- ConcreteObserver: 具體觀察者;實(shí)現(xiàn) Observer 所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。
類圖如下:
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 觀察者和被觀察者是抽象耦合的
缺點(diǎn):
- 如果一個(gè)被觀察者對象有很多的直接和間接的觀察者,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。
- 如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。
適用情況
- 一個(gè)對象必須通知其他對象,而并不知道這些對象是誰。
代理模式
模式定義
代理模式(Proxy Pattern) :給某一個(gè)對象提供一個(gè)代 理,并由代理對象控制對原對象的引用。代理模式的英文叫做Proxy或Surrogate,它是一種對象結(jié)構(gòu)型模式。
模式結(jié)構(gòu)
代理模式包含角色如下:
- Subject:抽象主題角色;聲明了 RealSubject 與 Proxy 的共同接口,定義了某個(gè)/些功能。
- RealSubject(真實(shí)主題):通常執(zhí)行具體的業(yè)務(wù)邏輯,Proxy 控制對它的訪問。
- Proxy:持有一個(gè) RealSubject 引用(指針),可以在需要時(shí)將請求轉(zhuǎn)發(fā)給 RealSubject,以此起到代理的作用。
- Client(客戶端):通過 Proxy 間接地與 RealSubject 進(jìn)行交互。
注意: Proxy 和 RealSubject 都實(shí)現(xiàn)了 Subject 的接口,這允許 Client 可以像處理 RealSubject 一樣處理 Proxy。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 代理模式能將代理對象與真正被調(diào)用的對象分離,在一定程度上降低了系統(tǒng)的耦合度。
- 在客戶端和目標(biāo)對象之間,代理起到一個(gè)中介作用,這樣可以保護(hù)目標(biāo)對象。在對目標(biāo)對象調(diào)用之前,代理對象也可以進(jìn)行其他操作。
缺點(diǎn):
- 這種模式引入了另一個(gè)抽象層,這有時(shí)可能是一個(gè)問題。如果真實(shí)主題被某些客戶端直接訪問,并且其中一些客戶端可能訪問代理類,這可能會(huì)導(dǎo)致不同的行為。
- 由于在客戶端和真實(shí)主題之間增加了代理對象,因此有些類型的代理模式可能會(huì)造成請求的處理速度變慢。
- 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。
適用場景
- 遠(yuǎn)程代理(Remote Proxy):為一個(gè)位于不同地址空間的對象提供一個(gè)本地代理,對代理的方法調(diào)用會(huì)導(dǎo)致對遠(yuǎn)程對象的方法調(diào)用。ATM 就是一個(gè)例子,ATM 可能會(huì)持有(存在于遠(yuǎn)程服務(wù)器中的)銀行信息的一個(gè)代理對象。
- 虛擬代理(Virtual Proxy):使用虛擬代理,代理可以作為一個(gè)(資源消耗較大的)對象的代表。虛擬代理經(jīng)常延遲對象的創(chuàng)建,直到需要為止。在創(chuàng)建對象之前(及創(chuàng)建對象過程中),虛擬代理也可以作為對象的代理;之后,代理將請求直接委托給 RealSubject。
- 保護(hù)代理(Protection Proxy):根據(jù)訪問權(quán)限,可以使用保護(hù)代理來控制對資源的訪問。
裝飾模式
對于類或者對象的行為增加,一般有兩種方式:
- 繼承機(jī)制:使用繼承機(jī)制,直接進(jìn)行函數(shù)的添加。
- 關(guān)聯(lián)機(jī)制,即將一個(gè)類的對象嵌入另外一個(gè)對象中,由另外一個(gè)對象來決定是否調(diào)用嵌入對象的行為,以便擴(kuò)展自己的行為。,我們稱這個(gè)嵌入的對象為“裝飾器”。
模式定義:
裝飾模式(Decorator Pattern) :動(dòng)態(tài)地給一個(gè)對象增加一些額外的職責(zé)(Responsibility),就增加對象功能來說,裝飾模式比生成子類實(shí)現(xiàn)更為靈活。其別名也可以稱為包裝器(Wrapper),與適配器模式的別名相同,但它們適用于不同的場合。根據(jù)翻譯的不同,裝飾模式也有人稱之為“油漆工模式”,它是一種對象結(jié)構(gòu)型模式。
模式結(jié)構(gòu)
包含角色如下:
- Component: 抽象構(gòu)件
- ConcreteComponent: 具體構(gòu)件
- Decorator: 抽象裝飾類
- ConcreteDecorator: 具體裝飾類
裝飾模式中的裝飾類一般擁有為抽象構(gòu)建成員,通過具體構(gòu)建類來進(jìn)行添加操作,成為具體的裝飾類,最終實(shí)現(xiàn)具體的類操作的擴(kuò)展,裝飾器一般也來自于基礎(chǔ)的抽象構(gòu)件
優(yōu)點(diǎn)
- 裝飾模式提供比繼承更多的靈活度
缺點(diǎn)
- 使用裝飾模式時(shí),因?yàn)閷訉舆f進(jìn)關(guān)系,會(huì)產(chǎn)生很多無用的小對象;和具體的裝飾類。
適配器模式
適配器模式(Adapter Pattern) :將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工作,其別名為包裝器(Wrapper)。適配器模式既可以作為類結(jié)構(gòu)型模式,也可以作為對象結(jié)構(gòu)型模式。
適配器模式(Adapter Pattern)是一種補(bǔ)救模式,將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,從而使原本由于接口不兼容而不能一起工作的類可以一起工作。
1.3 模式結(jié)構(gòu)
適配器模式包含如下角色:
- Target:目標(biāo)抽象類
- Adapter:適配器類
- Adaptee:適配者類
- Client:客戶類
適配器模式有對象適配器和類適配器兩種實(shí)現(xiàn):
對象適配器:
優(yōu)點(diǎn)
- 將目標(biāo)類和適配者類解耦,通過引入一個(gè)適配器類來重用現(xiàn)有的適配者類,而無須修改原有代碼。
- 增加了類的透明性和復(fù)用性。
對象適配器模式還具有如下優(yōu)點(diǎn): 一個(gè)對象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),也就是說,同一個(gè)適配器可以把適配者類和它的子類都適配到目標(biāo)接口。文章來源地址http://www.zghlxwxcb.cn/news/detail-782719.html文章來源:http://www.zghlxwxcb.cn/news/detail-782719.html
缺點(diǎn)
- 對象適配器:
-mWsqMa1A-1704852256417)]
優(yōu)點(diǎn)
- 將目標(biāo)類和適配者類解耦,通過引入一個(gè)適配器類來重用現(xiàn)有的適配者類,而無須修改原有代碼。
- 增加了類的透明性和復(fù)用性。
對象適配器模式還具有如下優(yōu)點(diǎn): 一個(gè)對象適配器可以把多個(gè)不同的適配者適配到同一個(gè)目標(biāo),也就是說,同一個(gè)適配器可以把適配者類和它的子類都適配到目標(biāo)接口。
缺點(diǎn)
- 對象適配器:
- 與類適配器模式相比,要想置換適配者類的方法就不容易。如果一定要置換掉適配者類的一個(gè)或多個(gè)方法,就只好先做一個(gè)適配者類的子類,將適配者類的方法置換掉,然后再把適配者類的子類當(dāng)做真正的適配者進(jìn)行適配,實(shí)現(xiàn)過程較為復(fù)雜。
到了這里,關(guān)于設(shè)計(jì)模式面試的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!