观察者模式:又称作发布-订阅者模式,定义了一种依赖关系,解决了主体对象与观察者之间功能的耦合。
代码::定义观察者类,实现事件的监听,触发和取消。
// 定义观察者类
var Observer = (function(){
var _messages = []
return {
// 注册信息接口
regist: function(type, fn){
// 事件如果没注册,初始化事件队列,否则push到队列中
if (typeof _messages[type] === 'undefined') {
_messages[type] = [fn]
} else {
_messages[type].push(fn)
}
},
// 发布信息接口
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('简述观察者模式')