js观察者模式
2019-07-25 22:08
2485人阅读
评论 (0)
Tags: javascriptobserver
// 通知事件类型
const EVENT_DOG_BARK = "DOG_BARK" // 狗叫
// 事件接口
class ObserverInterface {
/*
* 接收通知
* event: 事件对象
*/
notify(event) {
throw new Error(`This method was not implemented`)
}
}
// 事件类
class ObserverEvent {
/*
* 构造器
* name: 事件名称
* target: 触发事件对象
*/
constructor(name, target) {
this.name = name
this.target = target
}
}
// 主人
class Master extends ObserverInterface {
// 构造器
constructor(name) {
super()
// 名子
this.name = name
}
/*
* 接收通知
* event: 事件对象
*/
notify(event) {
// 检测事件类型
if (event.name === EVENT_DOG_BARK) {
console.log(`${this.name}: My dog is barking! What happened?`)
}
}
}
// 贼 小偷
class Thief extends ObserverInterface {
// 构造器
constructor(name) {
super()
// 名子
this.name = name
}
/*
* 接收通知
* event: 事件对象
*/
notify(event) {
// 检测事件类型
if (event.name === EVENT_DOG_BARK) {
console.log(`${this.name}: The dog is barking. I've been found! Run!`)
}
}
}
// 狗叫
class Dog {
// 构造器
constructor(name) {
// 名子
this.name = name
// 观察者 订阅者
this.observers = []
}
// 注册观察者
register(observer) {
if (observer instanceof ObserverInterface) {
this.observers.push(observer)
}
}
// 叫
bark() {
// 业务逻辑
console.log(`${this.name}: Dog bark!`)
// 事件对象
var event = new ObserverEvent(EVENT_DOG_BARK, this)
// 通知所有观察者
for (var i = 0; i < this.observers.length; i++) {
// 获取观察者
var observer = this.observers[i]
// 通知观察者
observer.notify(event)
}
}
}
// main逻辑
// 创建角色对象
// 狗 阿黄
var dog = new Dog("阿黄")
// 主人 张三
var master = new Master("张三")
// 贼1 李四
var thief1 = new Thief("李四")
// 贼2 王五
var thief2 = new Thief("王五")
// 注册观察者
dog.register(master) // 主人
dog.register(thief1) // 贼1
dog.register(thief2) // 贼2
// 狗发现了小偷
dog.bark()