觀察者模式案例
觀察者模式(發(fā)布-訂閱模式):其定義對(duì)象間一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知
var observer = {
regist:function(eventName,callback){
if(!this.obj){
this.obj = {};
}
if(!this.obj[eventName]){
this.obj[eventName] = [callback];
}else{
this.obj[eventName].push(callback);
}
},
emit:function(eventName){
for(var i = 0; i < this.obj[eventName].length; i++){
this.obj[eventName][i]();
// this.obj[eventName][i](arguments[n]); 有參數(shù)的
}
},
remove:function(eventName,callback){
for(var i = 0; i < this.obj[eventName].length; i++){
if(this.obj[eventName][i] == callback){
this.obj[eventName].splice(i,1);
}
}
}}
//給三個(gè)模塊注冊(cè)事件
observer.regist("loginSuccess",function(){
console.log("用戶信息模塊接收到了登錄成功的消息,做出了響應(yīng)");})
observer.regist("loginSuccess",function(){
console.log("購物車模塊接收到了登錄成功的消息,做出了響應(yīng)");})
observer.regist("loginSuccess",function(){
console.log("消息模塊接收到了登錄成功的消息,做出了響應(yīng)");})
observer.emit("loginSuccess"); //廣播
單例模式
顧名思義,單例就是單一的意思,單例模式的定義是:保證一個(gè)類僅有一個(gè)一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
新建對(duì)象時(shí)判斷全局是否有該對(duì)象,如果有,就返回該對(duì)象,沒有就創(chuàng)建一個(gè)新對(duì)象返回。
js
1. 簡(jiǎn)單實(shí)現(xiàn)
var Single = (function() {
var instance = null;
function Single(name) {
this.name = name;
}
return function(name){
if (!instance) {
instance = new Single(name);
}
return instance;
};
})();var oA = new Single('hi');var oB = new Single('hello');console.log(oA===oB);
解析:在第一次調(diào)用構(gòu)造函數(shù)時(shí)利用閉包存儲(chǔ)一個(gè)instance實(shí)例,以后的調(diào)用直接返回instance.
當(dāng)然了,現(xiàn)在都9012年了,ES6 來一波玩玩
class Singleton {
constructor(name) {
this.name = name;
this.instance = null;
}
static getInstance(name) {
if(!this.instance) {
this.instance = new Singleton(name);
}
return this.instance;
}
}var oA = Singleton.getInstance('hi');var oB = Singleton.getInstance('hisd');console.log(oA===oB);
static 關(guān)鍵字解釋:類相當(dāng)于實(shí)例的原型, 所有在類中定義的方法, 都會(huì)被實(shí)例繼承。 如果在一個(gè)方法前, 加上static關(guān)鍵字, 就表示該方法不會(huì)被實(shí)例繼承, 而是直接通過類來調(diào)用, 這就稱為“ 靜態(tài)方法”。
單例模式的應(yīng)用: 全局中只需要一個(gè)公用的實(shí)例對(duì)象,比如登錄彈窗組件。