# js設計模式
**開始!**
在程序中,大部分語言的實現都是基于“類”。 在js中并沒有類這個概念,js中的函數屬于對象,而基于js中閉包與弱類型等特性,在實現一些設計模式的方式上與眾不同。
## 設計原則
**單一職責原則(SRP)**
一個對象或方法只做一件事情。如果一個方法承擔了過多的職責,那么在需求的變遷過程中,需要改寫這個方法的可能性就越大。
應該把對象或方法劃分成較小的粒度
**最少知識原則(LKP)**
一個軟件實體應當 盡可能少地與其他實體發生相互作用?
應當盡量減少對象之間的交互。如果兩個對象之間不必彼此直接通信,那么這兩個對象就不要發生直接的 相互聯系,可以轉交給第三方進行處理
**開放-封閉原則(OCP)**
軟件實體(類、模塊、函數)等應該是可以 擴展的,但是不可修改
當需要改變一個程序的功能或者給這個程序增加新功能的時候,可以使用增加代碼的方式,盡量避免改動程序的源代碼,防止影響原系統的穩定
## 什么是設計模式?
>假設有一個空房間,我們要日復一日地往里面放一些東西。最簡單的辦法當然是把這些東西 直接扔進去,但是時間久了,就會發現很難從這 個房子里找到自己想要的東西,要調整某幾樣東 西的位置也不容易。所以在房間里做一些柜子也 許是個更好的選擇,雖然柜子會增加我們的成 本,但它可以在維護階段為我們帶來好處。使用 這些柜子存放東西的規則,或許就是一種模式 —— [《JavaScript設計模式與開發實踐》](https://book.douban.com/subject/26382780/)
學習設計模式,有助于寫出可復用和可維護性高的程序
設計模式的原則是“找出 程序中變化的地方,并將變化封裝起來”,它的關鍵是意圖,而不是結構。
不過要注意,使用不當的話,可能會事倍功半。
## 一、**單例模式**
1.定義
保證一個類僅有一個實例,并提供一個訪問他的全局訪問點
2.核心
確保只有一個實例,并提供全局訪問
3.實現
假設要設置一個管理員,多次調用也僅設置一次,我們可以使用閉包緩存一個內部變量來實現這個單例
```
function SetManager(name) {
this.manager = name;
}
SetManager.prototype.getName = function() {
console.log(this.manager);
};
var SingletonSetManager = (function() {
var manager = null;
return function(name) {
if (!manager) {
manager = new SetManager(name);
}
return manager;
}
})();
SingletonSetManager('a').getName(); // a
SingletonSetManager('b').getName(); // a
SingletonSetManager('c').getName(); // a
```
此為比較簡單的做法,但是假如我們還要設置一個別的角色比如說HR呢?就得復制一遍代碼了
所以,可以改寫單例內部,實現的更通用一些
~~~
// 提取出通用的單例
function getSingleton(fn) {
var instance = null;
return function() {
if (!instance) {
instance = fn.apply(this, arguments);
}
return instance;
}
}
~~~
>在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(context)而存在的,換句話說,就是為了改變函數體內部 this 的指向。
//先解釋一下apply方法
```
//一、
var name = '小王', age = 17;
var obj = {
name: '小張',
objAge: this.age,
myFun: function() {
console.log( this.name + '年 齡' + this.age )
}
}
obj.objAge; //17
obj.myFun() //小張年齡 undefined
//二、
var fav = '弱智'
function show() {
console.log(this.fav)
}
show() //弱智
可以發現第一個打印的this指向obj,第二個全局聲明this指向window call/apply/bind都是用來重新定義this這個對象的
如一中的代碼 加
var db = {
name: '神經病',
age: 99
}
obj.myFun.apply(db); //神經病年齡 99
```
接上所述
我們提取好之后,再進行調用 結果還是一樣
*****
# **觀察者模式**
**概念:**
>觀察者模式是軟件設計模式的一種。在此種模式中,一個目標對象管理所有相依于它的觀察者對象,并且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實時事件處理系統。
說的簡單些,就是在<font style="color: red">數據發生</font>改變時,對應的處理函數自動執行。