觀察者模式:又稱作發(fā)布-訂閱者模式耸别,定義了一種依賴關系,解決了主體對象與觀察者之間功能的耦合县钥。
代碼::定義觀察者類秀姐,實現(xiàn)事件的監(jiān)聽,觸發(fā)和取消若贮。
// 定義觀察者類
var Observer = (function(){
var _messages = []
return {
// 注冊信息接口
regist: function(type, fn){
// 事件如果沒注冊省有,初始化事件隊列痒留,否則push到隊列中
if (typeof _messages[type] === 'undefined') {
_messages[type] = [fn]
} else {
_messages[type].push(fn)
}
},
// 發(fā)布信息接口
fire: function(type, args){
// 該消息沒有注冊,結束
if (!_messages[type]) {
return
}
var events = {
type: type,
args: args || {}
},
i = 0,
len = _messages[type].length
for(;i<len;i++) {
_messages[type][i].call(this, events)
}
},
// 移除信息接口
remove: function(type, fn){
if (_messages[type] instanceof Array) {
var i = _messages[type].length - 1
for(; i >= 0; i--) {
_messages[type][i] === fn && _messages[type].splice(i, 1)
}
}
}
}
})()
// 例子:你來學校上學锥咸,課堂上有老師和學生,老師向學生提問细移,學生是提問對象搏予,因此他們是訂閱者,同時學生也有對問題的思考和回答問題的動作
var Student = function(result) {
var that = this
that.result = result
that.say = function(){
console.log(that.result)
}
}
Student.prototype.answer = function(question){
Observer.regist(question, this.say)
}
// 學生在睡覺弧轧,不能回答問題
Student.prototype.sleep = function(question){
Observer.remove(question, this.say)
}
var Teacher = function(){}
Teacher.prototype.ask = function(question){
console.log('問題是:' + question)
Observer.fire(question)
}
var student1 = new Student('學生1回答問題')
var student2 = new Student('學生2回答問題')
var student3 = new Student('學生3回答問題')
student1.answer('什么是設計模式')
student1.answer('簡述觀察者模式')
student2.answer('什么是設計模式')
student3.answer('什么是設計模式')
student3.answer('簡述觀察者模式')
student3.sleep('簡述觀察者模式')
var teacher = new Teacher()
teacher.ask('什么是設計模式')
teacher.ask('簡述觀察者模式')