面試官:說說對設計模式的理解?常見的設計模式有哪些?
本文轉載自微信公眾號「JS每日一題」,作者灰灰 。轉載本文請聯系JS每日一題公眾號。
一、是什么
在軟件工程中,設計模式是對軟件設計中普遍存在的各種問題所提出的解決方案
設計模式并不直接用來完成代碼的編寫,而是描述在各種不同情況下,要怎么解決問題的一種方案
設計模式能使不穩定依賴于相對穩定、具體依賴于相對抽象,避免會引起麻煩的緊耦合,以增強軟件設計面對并適應變化的能力
因此,當我們遇到合適的場景時,我們可能會條件反射一樣自然而然想到符合這種場景的設計模式
比如,當系統中某個接口的結構已經無法滿足我們現在的業務需求,但又不能改動這個接口,因為可能原來的系統很多功能都依賴于這個接口,改動接口會牽扯到太多文件
因此應對這種場景,我們可以很快地想到可以用適配器模式來解決這個問題
二、有哪些
常見的設計模式有:
- 單例模式
- 工廠模式
- 策略模式
- 代理模式
- 中介者模式
- 裝飾者模式
- ......
單例模式
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。實現的方法為先判斷實例存在與否,如果存在則直接返回,如果不存在就創建了再返回,這就確保了一個類只有一個實例對象
如下圖的車,只有一輛,一旦借出去則不能再借給別人:
工廠模式
工廠模式通常會分成3個角色:
- 工廠角色-負責實現創建所有實例的內部邏輯.
- 抽象產品角色-是所創建的所有對象的父類,負責描述所有實例所共有的公共接口
- 具體產品角色-是創建目標,所有創建的對象都充當這個角色的某個具體類的實例
策略模式
策略模式,就是定義一系列的算法,把他們一個個封裝起來,并且使他們可以相互替換
至少分成兩部分:
- 策略類(可變),策略類封裝了具體的算法,并負責具體的計算過程
- 環境類(不變),接受客戶的請求,隨后將請求委托給某一個策略類
代理模式
代理模式:為對象提供一個代用品或占位符,以便控制對它的訪問
例如實現圖片懶加載的功能,先通過一張loading圖占位,然后通過異步的方式加載圖片,等圖片加載好了再把完成的圖片加載到img標簽里面
中介者模式
中介者模式的定義:通過一個中介者對象,其他所有的相關對象都通過該中介者對象來通信,而不是相互引用,當其中的一個對象發生改變時,只需要通知中介者對象即可
通過中介者模式可以解除對象與對象之間的緊耦合關系
裝飾者模式
裝飾者模式的定義:在不改變對象自身的基礎上,在程序運行期間給對象動態地添加方法
通常運用在原有方法維持不變,在原有方法上再掛載其他方法來滿足現有需求
三、總結
不斷去學習設計模式,會對我們有著極大的幫助,主要如下:
從許多優秀的軟件系統中總結出的成功的、能夠實現可維護性、復用的設計方案,使用這些方案將可以讓我們避免做一些重復性的工作
設計模式提供了一套通用的設計詞匯和一種通用的形式來方便開發人員之間溝通和交流,使得設計方案更加通俗易懂
大部分設計模式都兼顧了系統的可重用性和可擴展性,這使得我們可以更好地重用一些已有的設計方案、功能模塊甚至一個完整的軟件系統,避免我們經常做一些重復的設計、編寫一些重復的代碼
合理使用設計模式并對設計模式的使用情況進行文檔化,將有助于別人更快地理解系統
學習設計模式將有助于初學者更加深入地理解面向對象思想
參考文獻
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