面試官:說說對設(shè)計(jì)模式的理解?常見的設(shè)計(jì)模式有哪些?
本文轉(zhuǎn)載自微信公眾號「JS每日一題」,作者灰灰 。轉(zhuǎn)載本文請聯(lián)系JS每日一題公眾號。
一、是什么
在軟件工程中,設(shè)計(jì)模式是對軟件設(shè)計(jì)中普遍存在的各種問題所提出的解決方案
設(shè)計(jì)模式并不直接用來完成代碼的編寫,而是描述在各種不同情況下,要怎么解決問題的一種方案
設(shè)計(jì)模式能使不穩(wěn)定依賴于相對穩(wěn)定、具體依賴于相對抽象,避免會引起麻煩的緊耦合,以增強(qiáng)軟件設(shè)計(jì)面對并適應(yīng)變化的能力
因此,當(dāng)我們遇到合適的場景時,我們可能會條件反射一樣自然而然想到符合這種場景的設(shè)計(jì)模式
比如,當(dāng)系統(tǒng)中某個接口的結(jié)構(gòu)已經(jīng)無法滿足我們現(xiàn)在的業(yè)務(wù)需求,但又不能改動這個接口,因?yàn)榭赡茉瓉淼南到y(tǒng)很多功能都依賴于這個接口,改動接口會牽扯到太多文件
因此應(yīng)對這種場景,我們可以很快地想到可以用適配器模式來解決這個問題
二、有哪些
常見的設(shè)計(jì)模式有:
- 單例模式
- 工廠模式
- 策略模式
- 代理模式
- 中介者模式
- 裝飾者模式
- ......
單例模式
保證一個類僅有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)。實(shí)現(xiàn)的方法為先判斷實(shí)例存在與否,如果存在則直接返回,如果不存在就創(chuàng)建了再返回,這就確保了一個類只有一個實(shí)例對象
如下圖的車,只有一輛,一旦借出去則不能再借給別人:
工廠模式
工廠模式通常會分成3個角色:
- 工廠角色-負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯.
- 抽象產(chǎn)品角色-是所創(chuàng)建的所有對象的父類,負(fù)責(zé)描述所有實(shí)例所共有的公共接口
- 具體產(chǎn)品角色-是創(chuàng)建目標(biāo),所有創(chuàng)建的對象都充當(dāng)這個角色的某個具體類的實(shí)例
策略模式
策略模式,就是定義一系列的算法,把他們一個個封裝起來,并且使他們可以相互替換
至少分成兩部分:
- 策略類(可變),策略類封裝了具體的算法,并負(fù)責(zé)具體的計(jì)算過程
- 環(huán)境類(不變),接受客戶的請求,隨后將請求委托給某一個策略類
代理模式
代理模式:為對象提供一個代用品或占位符,以便控制對它的訪問
例如實(shí)現(xiàn)圖片懶加載的功能,先通過一張loading圖占位,然后通過異步的方式加載圖片,等圖片加載好了再把完成的圖片加載到img標(biāo)簽里面
中介者模式
中介者模式的定義:通過一個中介者對象,其他所有的相關(guān)對象都通過該中介者對象來通信,而不是相互引用,當(dāng)其中的一個對象發(fā)生改變時,只需要通知中介者對象即可
通過中介者模式可以解除對象與對象之間的緊耦合關(guān)系
裝飾者模式
裝飾者模式的定義:在不改變對象自身的基礎(chǔ)上,在程序運(yùn)行期間給對象動態(tài)地添加方法
通常運(yùn)用在原有方法維持不變,在原有方法上再掛載其他方法來滿足現(xiàn)有需求
三、總結(jié)
不斷去學(xué)習(xí)設(shè)計(jì)模式,會對我們有著極大的幫助,主要如下:
從許多優(yōu)秀的軟件系統(tǒng)中總結(jié)出的成功的、能夠?qū)崿F(xiàn)可維護(hù)性、復(fù)用的設(shè)計(jì)方案,使用這些方案將可以讓我們避免做一些重復(fù)性的工作
設(shè)計(jì)模式提供了一套通用的設(shè)計(jì)詞匯和一種通用的形式來方便開發(fā)人員之間溝通和交流,使得設(shè)計(jì)方案更加通俗易懂
大部分設(shè)計(jì)模式都兼顧了系統(tǒng)的可重用性和可擴(kuò)展性,這使得我們可以更好地重用一些已有的設(shè)計(jì)方案、功能模塊甚至一個完整的軟件系統(tǒng),避免我們經(jīng)常做一些重復(fù)的設(shè)計(jì)、編寫一些重復(fù)的代碼
合理使用設(shè)計(jì)模式并對設(shè)計(jì)模式的使用情況進(jìn)行文檔化,將有助于別人更快地理解系統(tǒng)
學(xué)習(xí)設(shè)計(jì)模式將有助于初學(xué)者更加深入地理解面向?qū)ο笏枷?/p>
參考文獻(xiàn)
https://zh.wikipedia.org/wiki/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_(%E8%AE%A1%E7%AE%97%E6%9C%BA)
https://juejin.cn/post/6844903795017646094
https://segmentfault.com/a/1190000030850326