JavaScript工廠模式和訂閱模式
設計模式的好處:
- 程式碼規範
// 例如表單驗證,兩個 input ,一個使用者名稱,一個密碼
// 通常做法是
function checkUser(){
//.....
}
function checkPassword(){
//.....
}
// 問題:
// 這是兩個全域性物件,而這兩個方法屬於一個表單的驗證
// 所以這應該是一個表單物件,起碼應該這麼寫
// 物件封裝,但是注意全域性物件
var checkObj = {
checkUser: function() {
//.....
},
checkPassword: function() {
//.....
}
}
// 問題:
// 物件過多
// 解決:閉包
(function(){
//.....
})()
工廠模式
// ajax 為例
var xhr = new XMLHttpRequest(); // IE6不相容XMLHttpRequest物件,需要使用ActiveXObject("Microsoft.XMLHTTP")
xhr.onreadystatechange = function(){
}
xhr.open();
xhr.send(null);
// 使用工廠模式
// 好處:低耦合,高內聚
var XMLHTTPFactory = function() {
var XMLHTTP = null;
if (window.XMLHttpRequest()){
XMLHTTP = new XMLHttpRequest();
} else {
XMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
}
return XMLHTTP;
}
// 使用
var xhr = XMLHTTPFactory();
訂閱者模式
// 訂閱者:買家
// 釋出者:賣家
var showObj = {}; // 定義釋出者
showObj.list = []; // 儲存訂閱者
// 增加訂閱者,訂閱訊息
showObj.listen = function (fn) { // fn回撥函式,輸出你想輸出的內容
showObj.list.push(fn);
}
showObj.trigger = function () {
for (var i = 0, fn; fn = this.list[i++];) {
fn.apply(this, arguments);
}
}
showObj.listen(function (color, size) {
console.log("顏色是" + color);
console.log("尺碼是" + size);
})
showObj.listen(function (color, size) {
console.log("再次輸出顏色是" + color);
console.log("再次輸出尺碼是" + size);
})
showObj.trigger("白色", 40);
showObj.trigger("黑色", 20);
// 你會發現輸出了兩遍,這是為什麼呢?
// 原因就在於showObj.list.push(fn)
// 那麼如何使不同的訂閱者檢視到屬於自己的訂閱呢
使用一個key區分
var showObj = {}; // 定義釋出者
showObj.list = []; // 儲存訂閱者
// 增加訂閱者,訂閱訊息
showObj.listen = function (key, fn) { // 在訂閱的時候給一個標識
if (!this.list[key]) {
this.list[key] = [];
}
showObj.list[key].push(fn);
}
showObj.trigger = function () { // 釋出的時候認識知道訂閱的訊息分別釋出給誰
// 取到訊息名稱
var key = Array.prototype.shift.call(arguments);
// 對應的回撥函式
var fns = this.list[key];
if (!fns || fns.length === 0) {
return;
}
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments);
}
}
showObj.listen("white", function (color, size) {
console.log("小愛同學訂閱的顏色是" + color);
console.log("小愛同學訂閱的尺碼是" + size);
})
showObj.listen("black", function (color, size) {
console.log("小冰同學訂閱的顏色是" + color);
console.log("小冰同學訂閱的尺碼是" + size);
})
showObj.trigger("white", "白色", 40);
showObj.trigger("black", "黑色", 20);
// 但是這樣的寫的話適用性太差,所以我們需要對其進行封裝。
封裝
var event = {
list: [],
listen: function (key, fn) { // 在訂閱的時候給一個標識
if (!this.list[key]) {
this.list[key] = [];
}
this.list[key].push(fn);
},
trigger: function () { // 釋出的時候認識知道訂閱的訊息分別釋出給誰
// 取到訊息名稱
var key = Array.prototype.shift.call(arguments);
// 對應的回撥函式
var fns = this.list[key];
if (!fns || fns.length === 0) {
return;
}
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments);
}
},
// 移除方法(取消訂閱)
remove: function (key, fn) {
var fns = this.list[key];
// 沒有訂閱過
if (!fns) {
return false;
}
// 回撥函式為空
if (!fn) {
fn && (fns.length = 0);
} else {
for (var i = fns.length - 1; i >= 0; i++) {
var _fn = fns[i];
if (_fn === fn) {
fns.splice(i, 1);//刪除訂閱者的回撥函式
}
}
}
}
};
var initEvent = function (obj) {
for (var i in event) {
obj[i] = event[i]
}
}
var showObj = {};// 讓任何一個普通物件都擁有釋出訂閱功能
initEvent(showObj);
showObj.listen("white", fn1 = function (color, size) {
console.log("小愛同學訂閱的顏色是" + color);
console.log("小愛同學訂閱的尺碼是" + size);
})
showObj.listen("black", fn2 = function (color, size) {
console.log("小冰同學訂閱的顏色是" + color);
console.log("小冰同學訂閱的尺碼是" + size);
})
showObj.trigger("white", "白色", 40);
showObj.trigger("black", "黑色", 20);
相關文章
- javascript模式 (3)——工廠模式和裝飾模式JavaScript模式
- javascript(js) 觀察者模式和釋出訂閱模式JavaScriptJS模式
- 設計模式之單例、工廠、釋出訂閱者模式設計模式設計模式單例
- JavaScript 設計模式 : 巧用'工廠模式'和'建立者'模式JavaScript設計模式
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 簡單工廠模式和抽象工廠模式模式抽象
- Javascript 設計模式之工廠模式JavaScript設計模式
- Javascript設計模式(二)工廠模式JavaScript設計模式
- Javascript(七)釋出-訂閱模式JavaScript模式
- JavaScript設計模式系列--釋出訂閱模式JavaScript設計模式
- Javascript設計模式之釋出-訂閱模式JavaScript設計模式
- 簡單工廠模式、工廠方法模式和抽象工廠模式有何區別?模式抽象
- javascript設計模式 之 5 釋出-訂閱模式JavaScript設計模式
- JavaScript設計模式 觀察者模式(釋出訂閱)JavaScript設計模式
- 簡單工廠和工廠模式模式
- javascript訂閱模式淺析和基礎例項JavaScript模式
- JavaScript 觀察者 (釋出/訂閱) 模式JavaScript模式
- Javascript中理解發布--訂閱模式JavaScript模式
- 簡單工廠模式、工廠模式、抽象工廠模式比較模式抽象
- 簡單工廠模式—>工廠模式模式
- JavaScript 設計模式之觀察者模式與釋出訂閱模式JavaScript設計模式
- JavaScript設計模式與實踐–工廠模式JavaScript設計模式
- JavaScript設計模式與實踐--工廠模式JavaScript設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 設計模式-工廠模式二(工廠方法模式)設計模式
- javascript中的設計模式之釋出-訂閱模式JavaScript設計模式
- JavaScript建立物件(一)——工廠模式JavaScript物件模式
- 觀察者模式和釋出訂閱模式(上)模式
- 簡單工廠和工廠方法模式模式
- C# 設計模式(1)——簡單工廠模式、工廠模式、抽象工廠模式C#設計模式抽象
- 一篇搞定工廠模式【簡單工廠、工廠方法模式、抽象工廠模式】模式抽象
- 工廠模式之簡單工廠模式模式
- 小心訂閱模式模式
- 簡單工廠、工廠方法和抽象工廠模式抽象模式
- JavaScript中釋出/訂閱模式的理解JavaScript模式
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 設計模式之釋出訂閱模式(2) Redis 釋出/訂閱模式設計模式Redis
- 工廠模式 抽象模式模式抽象