概觀: 在本文中,我們將討論在JavaScript中使用的不同的設計模式. 大多數開發商想找出確切的或理想的設計模式,在他們的程序中使用. 老實說, 有沒有具體回答這個問題,或有沒有這會找出正確的設計模式的公式在特定情況下被使用. 所以在這樣的情況, 我們應該有設計模式的堅定喘息和具體問題,他們處理, 我們應該在一個更好的局面採取哪些設計模式,其中狀態下使用的決定.
介紹:
設計模式是可以在軟件設計和開發適用於常見的重新發生的問題,可重用解決方案. 由於使用的模板來解決共同問題的設計模式也被稱為. 設計模式有三大好處:
- 他們是成熟的解決方案: 設計模式提供軟件的發展提供了堅實的方式,並使用成熟的技術,.
- 可以很容易地重用: 設計模式的概念,並提供了一個適合我們的需求的一攬子解決方案. 這一特點使設計模式更強大和在類似條件下,它們可以被重新用於.
- 模式是表現: 每一個設計圖案呈現其可以被用來提供更大問題的解一組預定義結構和詞彙.
設計模式從來沒有提供對一個問題的精確解. 要注意,模式的作用是提供一個解決方案是非常重要的.
設計模式的類型
設計模式可分為以下三個子類別:
- 造物設計模式 : 在這一類下面設計模式落 :
- 獨生子
- 生成器
- 廠
- 抽象
- 原型
- 生成器
- 結構設計模式 : 在這一類下面設計模式落 :
- 裝飾
- 正面
- 次最輕量級職業拳擊手
- 適配器
- 代理
- 行為設計模式 : 在這一類的以下設計圖案秋天 :
- 迭代器
- 遊客
- 中間人
- 觀察
在JavaScript中模式:
下面的模式在JavaScript中常用的:
- 構造模式
- 模塊模式
- Singleton模式
- 觀察者模式
- 調解模式
- 原型模式
- 命令模式
- 門面模式
- 工廠模式
- 裝飾圖案
- 享元模式
構造器模式:
按照經典的面向對象的編程概念, 構造是用於在所述存儲器中創建一個對象的一個實例方法的一種特殊類型的. 在JavaScript對象的創建是通過使用以下三種辦法:
Listing 1: 在JavaScript中用於創建對象的三種方法
[Code]
// 途徑 1
是NEWOBJECT = {};
//途徑 2
VAR NEWOBJECT =的Object.create(零);
//途徑 3
VAR NEWOBJECT =新對象();
[/Code]
在第三種方法中, 目的是使用在沒有值傳遞或設置對象的構造函數創建. 有多種方法可以值設置一個新創建的對象. These are:
Listing 2: 途徑值設置構造
[Code]
//途徑 1
newObject.someKey =“Hello World”的
//途徑 2
NEWOBJECT[someKey] =“Hello World”的
//途徑 3
Object.defineProperty( NEWOBJECT, “someKey”, {
值 : “你好,世界” 可寫的 : 真 枚舉 : 真 配置 : 真 ); [/Code] |
Singleton模式:
我們都知道,單件模式限制了單一實例的創建一個對象. Singleton模式通過與它創建僅當沒有其它實例中存在的對象的新實例的方法創建類實現. 在JavaScript單身作為從全局命名空間隔離的實現共享資源的命名空間. 在JavaScript, 單以下列方式實施:
Listing 3: 在JavaScript中執行辛格爾頓
[Code]
是mySingleton = (功能 () {
// 實例存儲對辛格爾頓參考
例如VAR;
初始化函數() {
// 獨生子
// 私有方法和變量
功能privateMethod(){
的console.log( “我私人” );
}
是私有變量= “林還私”;
VAR privateRandomNumber =的Math.random();
return {
// 公共方法和變量
publicMethod: 功能 () {
的console.log( “市民可以看到我!” );
},
公共財產: “我也公開”,
getRandomNumber的: 功能() {
返回privateRandomNumber;
}
};
};
return {
// 如果存在獲取Singleton實例
// 或創建一個,如果它不
的getInstance: 功能 () {
如果 ( !例 ) {
實例初始化=();
}
例如返回;
}
};
})();
是myBadSingleton = (功能 () {
// 實例存儲對辛格爾頓參考
例如VAR;
初始化函數() {
// 獨生子
VAR privateRandomNumber =的Math.random();
return {
getRandomNumber的: 功能() {
返回privateRandomNumber;
}
};
};
return {
// 總是創建一個新的Singleton實例
的getInstance: 功能 () {
實例初始化=();
例如返回;
}
};
})();
// 用法:
是single1 = mySingleton.getInstance();
是single2 = mySingleton.getInstance();
的console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); // 真
VAR badSingle1 = myBadSingleton.getInstance();
VAR badSingle2 = myBadSingleton.getInstance();
的console.log( badSingleA.getRandomNumber() !== badSingleB.getRandomNumber() ); // 真
[/Code]
按照GoF的, 單是適用於以下幾種情況:
- 應該正好存在於對象實例.
- 唯一的實例應該由子類是可擴展.
觀察者模式:
在觀察者模式, 物體 (也被稱為主題) 維持依賴於它的對象列表簡稱為觀察員. 該主題自動通知給觀察者所發生的任何變化, 使用廣播機構. Observer模式的實現如下所示.
Listing 4: 依賴觀察員名單的對象可以有
[Code]
功能ObserverList(){ this.observerList = [];} ObserverList.prototype.Add = function( OBJ ){ return this.observerList.push( OBJ );}; ObserverList.prototype.Empty = function(){ this.observerList = [];}; ObserverList.prototype.Count = function(){ return this.observerList.length;}; ObserverList.prototype.Get = function( index ){ 如果( index > -1 && index < this.observerList.length ){ return this.observerList[ index ]; }}; ObserverList.prototype.Insert = function( OBJ, index ){ var pointer = -1; 如果( 指數=== 0 ){ this.observerList.unshift( OBJ ); pointer = index; }否則,如果( 指數=== this.observerList.length ){ this.observerList.push( OBJ ); pointer = index; } return pointer;}; ObserverList.prototype.IndexOf = function( OBJ, 的startIndex ){ var i = startIndex, 指針= -1; while( 我 < this.observerList.length ){ 如果( this.observerList[我] === OBJ ){ pointer = i; } 我 ; } return pointer;}; ObserverList.prototype.RemoveAt = function( index ){ 如果( 指數=== 0 ){ this.observerList.shift(); }否則,如果( 指數=== this.observerList.length -1 ){ this.observerList.pop(); }}; // Extend an object with an extensionfunction extend( extension, OBJ ){ 為 ( 在擴展VAR關鍵 ){ OBJ[key] =擴展[key]; }}
[/Code]
Listing 5: 主題
[Code]
主題功能(){ this.observers = new ObserverList();} Subject.prototype.AddObserver = function( 觀察者 ){ this.observers.Add( 觀察者 );}; Subject.prototype.RemoveObserver = function( 觀察者 ){ this.observers.RemoveAt( this.observers.IndexOf( 觀察者, 0 ) );}; Subject.prototype.Notify = function( 背景 ){ var observerCount = this.observers.Count(); 為(var i=0; 我 < observerCount; 我 ){ this.observers.Get(我).更新( 背景 ); }};
[/Code]
在上面的例子, 使用觀察者組件, 我們現在定義:
- 一種把新觀察到的複選框的頁面按鈕
- 控制複選框,將作為一個主題, 通知他們應檢查其他複選框
- 被添加了一個新的複選框容器
的HTML代碼作為下
Listing 5: HTML代碼
[Code]
<按鈕的ID =”addNewObserver”>添加新的觀察員複選框</鈕><輸入ID =”mainCheckbox” 類型=”複選框”/><DIV ID =”observersContainer”></DIV>
[/Code]
Summary: 因此,在這篇文章中我已經討論了關於JavaScript的設計模式細節. 設計模式適用於所有類型的像面向對象語言的Java語言,也是腳本語言如JavaScript. 但也有分歧,我們在上面的例子中看到它. 因此得出結論的討論,我們可以說,設計模式是用來提供解決經常出現的問題. 並請記住,設計模式
- 已被證明的解決方案
- 可以很容易地使用
- 以表現
希望你理解的概念,它會幫助你實現它在自己的項目. 快樂的閱讀.
在JS更有趣的文章 — 您必須閱讀