js的觀察者模式

//聲明主題對象
            var Subject = function(name) {
                this.name = name
                this.register = []
            }
            Subject.prototype = {
                //註冊觀察者
                submit(observe) {
                    this.register.push(observe)
                    console.log('觀察者' + observe.id + '訂閱了本主題')
                    return this
                },
                //觀察者取關
                unsubmit(observe) {
                    var that = this
                    this.register.map(function(name, index) {
                        if (name == observe) {
                            that.register.splice(index, 1)
                            console.log(name.id + '取關了本主題')
                        }
                    })
                    return this
                },
                //在某些特定的時候,由主題向全部的訂閱者發佈事件
                radioOn(name, value) {
                    this.register.map(rg => {
                        rg[name](value)
                    })
                    return this
                }
            }
            
            var Observe = function(id) {
                this.id = id
            }
            //供主題調用的事件
            Observe.prototype = {
                updata(msg) {
                    console.log('觀察者' + this.id + '更新了信息,信息爲' + msg)
                },
                init() {
                    console.log('觀察者' + this.id + '進行了初始化')
                },
                play(type) {
                    console.log('觀察者' + this.id + '開始玩起了' + type)
                }
            }
            //實例化一個主題
            var subject1 = new Subject('PUBG')
            
            //實例化三個觀察者對象
            var observe1 = new Observe('張三')
            var observe2 = new Observe('李四')
            var observe3 = new Observe('趙六')
            
            subject1.submit(observe1)
                    .submit(observe2)
                    .radioOn('init')
                    .radioOn('updata', '天命圈hhh')
                    .unsubmit(observe1)
                    .submit(observe3)
                    .radioOn('play', subject1.name)
            /*    觀察者張三訂閱了本主題
            *     觀察者李四訂閱了本主題
            *     觀察者張三進行了初始化
            *     觀察者李四進行了初始化
            *     觀察者張三更新了信息,信息爲天命圈hhh
            *     觀察者李四更新了信息,信息爲天命圈hhh
            *     張三取關了本主題
            *     觀察者趙六訂閱了本主題
            *     觀察者李四開始玩起了PUBG
            *     觀察者趙六開始玩起了PUBG
            */
相關文章
相關標籤/搜索