天天看點

JavaScript設計模式介紹

由于JavaScript不是典型的面向對象語言,因而在實作一些經典的設計模式上也與一般語言存在差異,本文主要介紹在JavaScript中如何實作常用的設計模式。

單例模式是最常見的設計模式,在一般的OOP語言中,我們可以通過私有化構造函數實作單例模式。但由于單例模式實際上可以看做傳回的是一個結構,該結構在記憶體中有且僅有唯一的一份,是以可以類比JavaScript中的閉包,是以可以記住閉包完成單例模式的實作:

觀察者模式下存在兩個成員:觀察者和被觀察者。觀察者在被被觀察者處進行注冊,當被觀察者相關狀态發生變化時,被觀察者告知觀察者,同時觀察者執行相應更新邏輯。通常來說,存在多個觀察者觀察同一個被觀察者的情況。在觀察者模式下,存在以下幾個元件:

被觀察者:維護一組被觀察接口,用于添加、删除觀察者,通知觀察者

觀察者:維護一組觀察者接口,用于在被觀察者狀态發生變化時,通知到觀察者

具體的被觀察者:實作被觀察者接口

具體的觀察者:實作觀察者接口

接下來我們基于觀察者模式實作一個例子:

一個按鈕,這個按鈕用于增加新的充當觀察者的選擇框到頁面上

一個控制器的選擇框,充當一個被觀察者,通知其他選擇框是否應該被選中

一個容器,用于放置新的選擇框

訂閱模式和觀察者模式很類似,都是建立觀察者與被觀察者之間的消息通道。觀察者模式需要觀察者顯示的調用被觀察者的觀察接口來聲明觀察關系,進而在代碼層面存在依賴關系。而訂閱模式通過使用主題/事件頻道将訂閱者和釋出者進行解耦。

工廠模式的實質由一個工廠類來代理對象(工廠模式下稱為元件)的構造,元件遵循同一套元件接口,使用方隻需按照工廠定制的标準将參數傳遞給工廠類的元件構造函數即可。工廠模式實作了元件使用方與元件之間的解耦,使得兩者之間不存在顯示的依賴關系,特别适合于元件衆多的情況。

mixin是javascript中最為常用的一種模式,幾乎所有javascript架構都用到了mixin。既可以将任意一個對象的全部和部分屬性拷貝到另一個對象或類上。Mix允許對象以最小量的複雜性從外部借用(或者說繼承)功能.作為一種利用Javascript對象原型工作得很好的模式,它為我們提供了從不止一個Mix處分享功能的相當靈活,但比多繼承有效得多得多的方式。

裝飾模式動态地給一個對象增加一些額外的職責。就功能來說,Decorator模式相比生成子類更靈活,在不改變接口的前提下可以增強類的功能,在如下場景可以考慮使用裝飾模式:

需要擴充一個類的功能,或給一個類增加附加責任

動态地給一個對象增加功能,這些功能可以再動态撤銷

需要增加一些基本功能的排列組合而産生的非常大量的功能,進而使繼承變得 不現實

裝飾模式下存在以下幾個角色:

抽象構件:給出一個抽象接口,以規範準備接收附加責任的對象

具體構件:定義一個将要接收附加責任的類

裝飾角色:持有一個構件對象的執行個體,并定一個與抽象構件一緻的接口

具體裝飾角色:負責給構件對象添加附加責任

JavaScript設計模式介紹

繼續閱讀