javaScript常用模式9種
迭代器模式
//例子實現
var agg = (function () {
var index = 0,
data = [1, 2, 3, 4, 5],
length = data.length;
return {
next: function () {
var element;
if (!this.hasNext()) {
return null;
}
element = data[index];
index = index + 2;
return element;
},
hasNext: function () {
return index < length
},
rewind: function () {
index = 0
},
current: function () {
return data[index]
}
}
}());
//測試迭代器
while(agg.hasNext()) {
console.log(agg.next());
}
//回退
agg.rewind();
console.log(agg.current());
觀察者模式
var publisher = {
subscribers: {
any: []//事件類型:訂閱者
},
//將訂閱者添加到訂閱者數組
subscribe: function (fn, type) {
type = type || 'any';
if (typeof this.subscribe[type] === "undefined") {
this.subscribers[type] = [];
}
this.subscribers[type].push(fn);
console.log(this.subscribers[type])
},
//移除訂閱者
unsubscribe: function (fn, type) {
this.visitSubscribers('unsubscribe', fn, type);
},
publish: function (publication, type) {
this.visitSubscribers('publish', publication, type);
},
visitSubscribers: function (action, arg, type) {
var pubtype = type || 'any',
subscribers = this.subscribers[pubtype],
i,
max = subscribers.length;
for (i = 0; i < max; i++) {
if (action = 'publish') {
subscribers[i](arg);
console.log('arg is ,' + arg)
} else {
if (subscribers[i] === arg) {
subscribers.splice(i, 1);
}
}
}
}
}
//makePublisher接受一個對象作為參數,通過吧上述通用發布者復制到該對象中,將其轉化為一個發布者
function makePublisher(o) {
var i;
for (i in publisher) {
if (publisher.hasOwnProperty(i) && typeof publisher[i] === "function") {
o[i] = publisher[i];
}
}
o.subscribers = { any: {} };
}
//paper對象用于發布日報和月刊
var paper = {
daily: function () {
this.publish('big news today');
},
monthly: function () {
this.publish('interesting analysis', 'monthly');
}
}
//將paper構成一個發行者
makePublisher(paper);
//訂閱者對象joe方法
var joe = {
drinkCoffee: function (paper) {
console.log('just read' + paper);
},
sundayPreNap: function (monthly) {
console.log('About to fall asleep reading this' + monthly);
}
}
//paper注冊joe
paper.subscribe(joe.drinkCoffee);
// paper.subscribe(joe.sundayPreNap, 'monthly');
paper.daily();
// paper.daily();
// paper.daily();
// paper.monthly();
// makePublisher(joe);
// joe.tweet = function (msg) {
// this.publish(msg);
// };
// paper.readTweets = function (tweet) {
// alert('Call big meeting! Someone ' + tweet);
// };
// joe.subscribe(paper.readTweets);
// joe.tweet("hated the paper today");
總結
- 單體模式
針對一個'類'創建一個對象.如果您想以構造函數的方法替換類的思想并且還保持類似java的語法,我們則為您考慮了多種方法.另外從技術上來說,javaScript中的所有對象都是單體.然而有時候程序員也會說單體,他們的本意是指以模塊模式創建的對象. - 工廠模式
根據字符串指定的類型在運行時創建對象的方法 - 迭代器模式
提供一個API來操縱或遍歷復雜的自定義數據結構 - 裝飾者模式
通過從預定義的裝飾者對象中添加功能,從而在運行時調整對象 - 策略模式
在選擇最饑餓策略以處理特定任務(上下文)的時候仍然保持相同的接口 - 外觀模式
把常用方法包裝在一個新的API中提供新的方法 - 代理模式
通過包裝一個對象控制對他的訪問,其主要方法是將訪問聚集為組或僅當真正必要時才執行的訪問,從而避免了高昂的操作開銷 - 中介者模式
通過使您的對象之間相互并不直接的通話,而是僅通過一個中介者對象進行通信,形成松散耦合
9.觀察者模式
通過創建的'可觀察的'對象,當發生一個感興趣的事件時可將該事件通知給所有的觀察者,從而形成松散耦合