一、狀態模式
- 狀態模式,一個對象有狀態變化。每次狀態變化都會觸發一個邏輯,不能總是用
if-else
來控制。
- 對於狀態模式的理解,可以舉一個例。比如在十字路口的時候,交通信號燈不同顏色的變化,會有其相應的指示命令。
- 對於狀態模式的場景,比如有限狀態機、一個簡單的
Promise
等等。有限狀態機是有限個狀態,以及在這些狀態之間的變化,比如交通燈。
- 狀態模式的設計原則驗證,將狀態對象和主題對象分離,狀態的變化邏輯單獨處理,符合開放封閉原則。
- 狀態模式的代碼,如下所示:
class State {
constructor(color) {
this.color = color
}
handle(context) {
console.log(`turn to ${this.color} light`)
context.setState(this)
}
}
class Context {
constructor() {
this.state = null
}
setState(state) {
this.state = state
}
getState() {
return this.state
}
}
let context = new Context()
let greed = new State('greed')
let yellow = new State('yellow')
let red = new State('red')
greed.handle(context)
console.log(context.getState())
yellow.handle(context)
console.log(context.getState())
red.handle(context)
console.log(context.getState())
二、原型模式
- 原型模式,
clone
自己,生成一個新對象。java
默認有 clone
接口,不用自己實現。
- 對比
JS
中的原型 prototype
,prototype
可以理解爲 ES6 class
的一種底層原理,而 class
是實現面向對象的基礎,並不是服務於某個模式。若干年後 ES6
普及,可能會忽略掉 prototype
,但是 Object.create
是會永久存在的。
三、橋接模式
- 橋接模式,用於把抽象化與實現化解耦,使得二者可以獨立變化。
- 橋接模式的設計驗證原則,抽象和實現分類,解耦,符合開放封閉原則。
四、組合模式
- 組合模式,生成樹形結構,表示整體與部分的關係,讓整體和部分都具有一致的操作方式。
- 對於組合模式的場景應用,在虛擬
DOM
中的 vnode
是這種形式,但是數據類型簡單。
- 對於組合模式,整體和單個節點的操作是一致的,整體和單個節點的數據結構也保持一致。
- 組合模式的設計原則驗證,將整體和單個節點的操作抽象出來,符合開放封閉原則。
五、享元模式
- 享元模式,共享內存,主要考慮的是內存,而非效率。相同的數據,共享使用。
- 享元模式的設計原則驗證,將相同的部分抽象出來,符合開放封閉原則。
六、策略模式
- 策略模式,不同策略分開處理,避免出現大量的
if...else
或者 switch...case
。
- 策略模式的設計原則驗證,不同策略,分開處理,而不是混合在一起,符合開放封閉原則。
七、模版方法模式和職責連模式
- 模版方法模式,通過一個模版封裝起來,調用的時候就可以直接使用。
- 職責連模式,一步操作可能分位多個職責角色來完成,把這些角色都分開,然後用一個鏈串起來,將發起者和各個處理者進行隔離。
JS
的鏈式操作,職責鏈模式和業務結合較多,JS
中能聯想到鏈式操作。jQuery
的鏈式操作,Promise.then
的鏈式操作。
- 職責連模式的設計原則驗證,發起者於各個處理者進行隔離,符合開放封閉原則。
八、命令模式
- 命令模式,執行命令時,發佈者和執行者分開。中間加入命令對象,作爲中轉站。
- 對於命令模式,發送者發出命令,調用命令對象,命令對象接收命令,調用接受者對應接口。
- 對於命令模式在
JS
中的應用,網頁富文本編輯器操作,瀏覽器封裝了一個命令對象。
- 命令模式的設計原則驗證,命令對象於執行對象分開,解耦,符合開放封閉原則。
九、備忘錄模式
- 備忘錄模式,隨時記錄一個對象的狀態變化,隨時可以恢復之前的某個狀態,比如撤銷功能。
- 備忘錄模式的設計原則驗證,狀態對象於使用者分開,解耦,符合開放封閉原則。
十、中介者模式
- 中介者模式,如果有很多個對象之間相互存在依賴關係,這個時候可以用中介者去管理,各個對象與中介者之間進行聯繫。
- 中介者模式的設計原則驗證,將各個關聯對象通過中介者隔離,符合開放封閉原則。
十一、訪問者模式和解釋器模式
- 訪問者模式, 將數據操作和數據結構進行分離,使用場景不多。
- 解釋器模式,描述語言語法如何定義,如何解釋和編譯,用於專業場景。