前言:前些年做拖拽的时候调研了很多产品,后来选了X6,但是里面很多二次功能的实现,设计模式都是参考 imove,当时不知道一直用的 高度封装trigger ,
现在恍然大悟就是大名鼎鼎的发布订阅模式
1.观察者模式
观察者模式一般有观察者和被观察者
打个不恰当比喻,甲乙丙丁强哥 五人去抢银行,强哥望风,
强哥就是被观察者, 甲乙丙丁就是观察者,四个观察者要看强哥行事
2.发布订阅模式
这个就有意思了 这个模式比较大 不再是一个小犯罪团伙了
队伍1 甲乙丙丁(订阅)
队伍2 一二三四 (订阅)
三方服务:高德地图 (调度中心)
队伍1 队伍2 分别抢劫两个银行 都在高德地图订阅了 警察通知服务
出警 (发布者)
高德地图 (收到警车运行讯息)
队伍1 队伍2 (收到高德地图的通知)
3.总结
1.不同:角色数量不同
2..不同: 观察者模式有松耦合关系 发布订阅没有耦合
3.使用: 观察者单个应用内部 发布订阅场景更大 跨应用 信息中间件kafka
综上所述:她们不同 但是她们思想都有发布订阅的思想
4.经典代码示例(兄弟们啊 这个真的牛皮 学的融会贯通 设计组件 牛皮哄哄)
- var Event = (function(){
- var list = {},
- listen,
- trigger,
- remove;
- listen = function(key,fn){
- if(!list[key]) {
- list[key] = [];
- }
- list[key].push(fn);
- };
- trigger = function(){
- var key = Array.prototype.shift.call(arguments),
- fns = list[key];
- if(!fns || fns.length === 0) {
- return false;
- }
- for(var i = 0, fn; fn = fns[i++];) {
- fn.apply(this,arguments);
- }
- };
- remove = function(key,fn){
- var fns = list[key];
- if(!fns) {
- return false;
- }
- if(!fn) {
- fns && (fns.length = 0);
- }else {
- for(var i = fns.length - 1; i >= 0; i--){
- var _fn = fns[i];
- if(_fn === fn) {
- fns.splice(i,1);
- }
- }
- }
- };
- return {
- listen: listen,
- trigger: trigger,
- remove: remove
- }
- })();
- // 测试代码如下:
- Event.listen("color",function(size) {
- console.log("尺码为:"+size); // 打印出尺码为42
- });
- Event.trigger("color",42);