寫在前面
編寫易於維護的代碼,其中最重要的方面就是能夠找到代碼中重復出現的主題並優化他們,這也是設計模式最有價值的地方
《head first設計模式》里有一篇文章,是說使用模式的心智,
1、初學者"心智" :"我要為HELLO WORLD找個模式"
2、中級人員模式: "或許這里我需要一個單件模式"
3、悟道者心智:"在這里使用一個裝飾者模式相當自然"
but,but,but,不學,連初學者都不算吶...
先了解一下設計模式的起源吧:
>>>設計模式最初起源於奧地利維也納的一個土木工程師克里斯托弗·亞歷山大,模式語言最早是為了解決復雜工程項目而創立的,30年前,軟件開發工程師們的開始把亞歷山大編寫的設計原則納入首個設計模式的文檔中。
>>>1995年,出版了《設計模式:可復用面向對象軟件的基礎》,就這樣經過開發工程師們的經驗的總結與使用,成長成為今天的設計模式,已經得到了廣泛的使用,是初級開發人員改進編程技巧的指南。
Module(模塊)模式
模塊是任何強大的應用程序框架中不可或缺的一部分,也是在程序框架中應用比較廣泛的模式,他幫助我們清楚的分離組織項目中代碼單元,
在module模式中,,可以使一個對象擁有共有/私有方法和變量,從而屏蔽來自全局作用域的特殊部分
我們來一艘卡通版的module~
相信聰明的你已經觀察出來了,在module模式中,有兩個重要的點就是公有和私有 ,
module模式提供了一種混合公有/私有方法和變量的方式,防止其泄露至全局作用域,並與別的開發人員接口發生沖突,
通過該模式,只需返回一個公有的API,而其他的一切都維持在私有閉包里。
我們來寫一個簡單的示例:<通過module模式實現一個購物車>
在module模式中,我們注意到了,我們返回了一個object對象。他會自動賦值給basketModule,以便我們可以與他交互.
我們的函數能夠享有私有函數的自由,因為他們不會暴露於頁面的其他部分,
當我們試着輸出console.log(basket) ,發現不能正常工作,因為basket只存在basketModule閉包的作用域中,而不是存在於返回的公有對象里。
Module模式變化
1、引入混入
模式的引入混入變化演示了全局變量如何作為參數傳遞給模塊的匿名函數,如果你想在你的模式中使用jQuery或者underscore等等中的方法
通過全局變量(jQuery、underscore)傳遞參數給模塊的方式來使用全局變量中的方法。
2、引出
我們聲明一個全局變量,而不需要使用他。然后接下來你用樣可以使用引入混入的方法引入該全局變量
我們在控制台輸出myModule,里面已經存在了一公有變量和方法,
但是module,privateVariable、privateMethod對外仍然是不可見的,這樣也保持了全局變量的純潔性
Revealing module(揭示)模式
我們理解了module模式之后,我們來看一個稍有改進的版本 — —Revealing module模式:
Revealing module的關鍵在於:將暴露的公有指針指向私有函數和屬性上
Heilmann創建的這種改進版的module模式,可以使腳本語法更加一致。在模板代碼的底部,他很容易指出哪些函數和變量可以被公開訪問,從而改善可讀性
但是Revealing module 相比 module模式創建的模塊更加脆弱,所以使用時應特別小心(ヽ( ̄▽ ̄)و,hey,我會注意)
寫在后面
module模式的優勢是很明顯的,它支持私有數據,在module模式中代碼的公有部分能夠接觸私有部分,而外界無法接觸類的私有部分。
那么module模式有哪些缺點呢?由於我們訪問公有和私有成員的方式不同,當我們想要改變可見性時,我們就需要修改每一個曾經使用過該成員的地方。還有其他的一些缺點
雖然如此module仍然是相當有用的。
參考書籍:
《JavaScript設計模式》
《head first設計模式》