实现观察者模式-observer

蒋钦
• 阅读 1274

来源于:阿贤博客

observer 观察者模式

我们在日常开发使用经常遇到一些场景需要使用到观察者模式,比如登录成功需要改动同步页面多个模块的信息,这时最佳选择是使用observer 观察者模式。
又是一个难忘清明节,这一次在大巴上过节了,只能在大巴上写作咯,从昨晚9点30分在广州省汽车站出发到现在中午12点30分还未到。历经了15个小时还未到家,不是老家路途太遥远,而是中国人有钱的人家太多了,导致一路堵车。想必很多小伙伴都有同样的感受吧,不过还差1个多小时就到家了。
class Apm {
    constructor(){
        //观察者模式
        this.observer = {
            //订阅
            addSubscriber: function (callback, opt) {
                this.subscribers[this.subscribers.length] = {
                    callback: callback,
                    opt: (opt !== 'undefined') ? opt : {}
                };
            },
            //退订
            removeSubscriber: function (callback) {
                for (var i = 0; i < this.subscribers.length; i++) {
                    if (this.subscribers[i].callback === callback) {
                        delete (this.subscribers[i]);
                    }
                }
            },
            //发布
            publish: function (what, _observer) {
                for (var i = 0; i < this.subscribers.length; i++) {
                    if (typeof this.subscribers[i].callback === 'function') {
                        
                        let observer = (_observer !== 'undefined') ? _observer : {};
                        // 执行注册的各种回调
                        this.subscribers[i].callback({ret: what, opt: this.subscribers[i].opt, observer: observer});
                    }
                }
            },
            // 将对象o具有观察者功能
            make: function (o) { 
                for (var i in this) {
                    o[i] = this[i];
                    o.subscribers = [];
                }
            }
        };
        this.observerLogin = {
            success: function (ret) {
                this.publish(ret, {type: 'success'});
            },
            error: function(ret){
                this.publish(ret, {type: 'error'});
            }
        };
        // 创建观察者模式
        this.observer.make(this.observerLogin);
    }
    login() {
        fetch({}).then((res)=>{
            if(res.code == 0){
                //发布登录成功
                this.observerLogin.success(ret);
            }else{
                //发布登录失败
                this.observerLogin.error (ret);
            }
            
        })
    }
}
var apm = new Apm;

//业务逻辑
var Main = {
    init: function(){
        var _ts = this;
        //监听登录成功时触发数据
        apm.observerLogin.addSubscriber(function(params){
            /*params = {
                ret: ret,//接口数据
                opt: opt, //方法传参
                observer: { //观察者数据
                    type: 'success'
                }
            };*/
        }, {_ts: _ts});
        
        /**** 观察者模式 ****/
        var testPage = {
            comment: function (data) {
                console.log('评论功能的作者名字:' + data['name'], data['msg']);
                // for(var key in data){
                //     console.log('key', key, data[key]);
                // }
            },
            video: function (data){
                console.log('视频作者bid:' + data['bid'], data['msg']);
            }
        };

        //先注册登录观察
        apm.observerLogin.addSubscriber(testPage.comment);
        apm.observerLogin.removeSubscriber(testPage.video);
    }
};

来源于:阿贤博客

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
C++中观察者模式中观察者提供接口让被观察者回调删除其自己安全吗?
思考如下情况:Observer类作为观察者,Handler类作为被观察者负责具体的任务执行,当任务执行完毕以后通知观察者完成。Observer收到调用以后删除Handler类。以下代码安全吗? 结果:1.安全。2.不优雅。3.handler在通过调用notify接口以后还可以访问自己的资源吗?可以,但是会得到随机值。/
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
3年前
00_设计模式之语言选择
设计模式之语言选择设计模式简介背景设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这