-
Notifications
You must be signed in to change notification settings - Fork 66
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
实现一个观察者模式 #41
Comments
redux的createStore方法
|
} |
观察者模式有一个别名叫“发布-订阅模式”,或者说是“订阅-发布模式”,订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。发布订阅者是观察者模式的一种别名。
|
观察者模式
//有一家猎人工会,其中每个猎人都具有发布任务(publish),订阅任务(subscribe)的功能
//他们都有一个订阅列表来记录谁订阅了自己
//定义一个猎人类
//包括姓名,级别,订阅列表
function Hunter(name, level){
this.name = name
this.level = level
this.list = []
}
Hunter.prototype.publish = function (money){
console.log(this.level + '猎人' + this.name + '寻求帮助')
this.list.forEach(function(item, index){
item(money)
})
}
Hunter.prototype.subscribe = function (targrt, fn){
console.log(this.level + '猎人' + this.name + '订阅了' + targrt.name)
targrt.list.push(fn)
}
//猎人工会走来了几个猎人
let hunterMing = new Hunter('小明', '黄金')
let hunterJin = new Hunter('小金', '白银')
let hunterZhang = new Hunter('小张', '黄金')
let hunterPeter = new Hunter('Peter', '青铜')
//Peter等级较低,可能需要帮助,所以小明,小金,小张都订阅了Peter
hunterMing.subscribe(hunterPeter, function(money){
console.log('小明表示:' + (money > 200 ? '' : '暂时很忙,不能') + '给予帮助')
})
hunterJin.subscribe(hunterPeter, function(){
console.log('小金表示:给予帮助')
})
hunterZhang.subscribe(hunterPeter, function(){
console.log('小张表示:给予帮助')
})
//Peter遇到困难,赏金198寻求帮助
hunterPeter.publish(198)
//猎人们(观察者)关联他们感兴趣的猎人(目标对象),如Peter,当Peter有困难时,会自动通知给他们(观察者) 发布订阅模式
//定义一家猎人工会
//主要功能包括任务发布大厅(topics),以及订阅任务(subscribe),发布任务(publish)
let HunterUnion = {
type: 'hunt',
topics: Object.create(null),
subscribe: function (topic, fn){
if(!this.topics[topic]){
this.topics[topic] = [];
}
this.topics[topic].push(fn);
},
publish: function (topic, money){
if(!this.topics[topic])
return;
for(let fn of this.topics[topic]){
fn(money)
}
}
}
//定义一个猎人类
//包括姓名,级别
function Hunter(name, level){
this.name = name
this.level = level
}
//猎人可在猎人工会发布订阅任务
Hunter.prototype.subscribe = function (topic, fn){
console.log(this.level + '猎人' + this.name + '订阅了狩猎' + topic + '的任务')
HunterUnion.subscribe(topic, fn)
}
Hunter.prototype.publish = function (topic, money){
console.log(this.level + '猎人' + this.name + '发布了狩猎' + topic + '的任务')
HunterUnion.publish(topic, money)
}
//猎人工会走来了几个猎人
let hunterMing = new Hunter('小明', '黄金')
let hunterJin = new Hunter('小金', '白银')
let hunterZhang = new Hunter('小张', '黄金')
let hunterPeter = new Hunter('Peter', '青铜')
//小明,小金,小张分别订阅了狩猎tiger的任务
hunterMing.subscribe('tiger', function(money){
console.log('小明表示:' + (money > 200 ? '' : '不') + '接取任务')
})
hunterJin.subscribe('tiger', function(money){
console.log('小金表示:接取任务')
})
hunterZhang.subscribe('tiger', function(money){
console.log('小张表示:接取任务')
})
//Peter订阅了狩猎sheep的任务
hunterPeter.subscribe('sheep', function(money){
console.log('Peter表示:接取任务')
})
//Peter发布了狩猎tiger的任务
hunterPeter.publish('tiger', 198)
//猎人们发布(发布者)或订阅(观察者/订阅者)任务都是通过猎人工会(调度中心)关联起来的,他们没有直接的交流。 |
|
const observer = (function() {
let subscribers = []
function publish(news) {
subscribers.forEach((subscriber) => {
subscriber(news)
})
}
function subscribe(subscriber) {
const index = subscribers.length
subscribers = [...subscribers, subscriber]
return () => {
subscribers = [
...subscribers.slice(0, index),
...subscribers.slice(index + 1)
]
}
}
return {
publish,
subscribe
}
})() |
参考: |
观察者模式
function Observable(){
// 保存事件和方法
this.handles = {};
}
Observable.prototype={
// 传入事件类型type和事件处理handle
on: function (type, handle) {
if(!this.handles[type]){
this.handles[type] = [];
}
this.handles[type].push(handle);
},
emit: function () {
// 通过传入参数获取事件类型
var type = Array.prototype.shift.call(arguments);
if(!this.handles[type]){
return false;
}
for (var i = 0; i < this.handles[type].length; i++) {
var handle = this.handles[type][i];
//执行事件
handle.apply(this, arguments);
}
},
off: function (type, handle) {
handles = this.handles[type];
if(handles){
if(!handle){
handles.length = 0; // 清空数组
}else{
for (var i = 0; i < handles.length; i++) {
var _handle = handles[i];
if(_handle === handle){
handles.splice(i,1);
}
}
}
}
}
}
var test1 = new Observable();
test1.on('星期', function (day) {
console.log('星期: '+ day); //
});
test1.emit('星期','一');
var test2 = new Observable();
var fn1 = function (day) {
console.log('星期: '+ day);
};
var fn2 = function (day) {
console.log('星期: '+ day);
};
test2.on('星期', fn1);
test2.on('星期', fn2);
test2.emit('星期','二');
test2.off('星期', fn1);
test2.emit('星期','三');
test2.off('星期');
test2.emit('星期','四'); |
|
1.观察者模式 // 声明一个漂亮的小姐姐 拥有 说 和 听 的功能 小姐姐到了谈婚论嫁的年龄 class beautifulGirl {
word;
status
listen:function(){
switch (status)
case 'beautiful':
console.log('小姐姐说:谢谢我一直都很美');
break;
case: 'forever 20 years old':
console.log('小姐姐说:Forever 18 years old')
break;
case: 'dalao':
console.log('小姐姐说:不仅是大佬哦 还漂亮哦')
break;
default:
console.log('小姐姐说:并不接受出自之外的任何status')
},
say: function(word,status){
word =word
status= status
}
}
认识了几个网友 性别男 分别加了小姐姐的联系方式
let man1 = new beautifulGirl()
let man2 = new beautifulGirl()
let man3 = new beautifulGirl()
man1.say(‘小姐姐 仰慕已久’,beautiful)
man1.listen()
man2.say('小姐姐','dorever 20 year olds')
man2.listen()
man3.say('小姐姐','dalao')
man3.listen() 上面这个例子举得有点不伦不类 搞得自己都有点模糊了 我并没有在开车 但是概念就是这个概念 一对多的关系 当一的某个属性发生改变 自动更新所有依赖于它的对象 1.发布订阅模式 小姐姐在想 mmp一个一个回信 回到啥时候 代码啥时候敲 直接一键群发 管你收到收不到 于是小姐姐开了一个公众号 将每天要发的消息 都推送到公众号 公众号再将这些消息发送到小姐姐的一排排仰慕者。 伪代码如下: 公众号有如下功能 推和被订阅 class messageCenter{
subscribe(){
},
publish(){
}
}
let xiaojiejie = new messageCenter()
xiaojiejie.publish('你喜欢我么?那你会不会给我的文章点赞 会不会去star 会不会来答题'); user 1,2,3 分别关注公众号 let user1 = new new messageCenter()
user1.subscribe()
let user2= new new messageCenter()
user2.subscribe()
let user3 = new new messageCenter()
user3.subscribe() 这时user1,2,3 都接收到了小姐姐的推送 然后小姐姐的star就多了起来。 |
No description provided.
The text was updated successfully, but these errors were encountered: