资讯专栏INFORMATION COLUMN

Observer和Mediator模式的区别

wapeyang / 1004人阅读

摘要:举个例子淘宝商铺卖家在淘宝上开了一个相机店最近都有意愿去买但是觉得价格稍贵,因此暂时不打算入手,想等价格稍微便宜一点后再入手,所以这个人通过淘宝先关注卖家的相机店。等到卖家的相机打折后,淘宝会向这个人推送打折消息。

Observer观察者模式

Observer观察者模式和Pub/sub模式事实上都是同一套路。这种模式建立起了不同对象之间的依赖关系:

当一个对象触发某个方法,或者发生变化时,其他关注这个对象的对象们,也会响应这个对象的变化。

    function setObserverBehavior (subjects) {
        if (!Array.isArray(subjects)) {
            if (subjects.length) {
                subjects = Array.from(subjects)
            } else {
                subjects = [subjects]
            }
        }
        
        subjects.forEach(function (subject) {
            subject.watchBy = function (target, type) {
                subject.addEventListener(type, function (evt) {
                    evt.sender = subject
                    evt.recevier = target
                    target.notice && target.notice(evt)
                })
            }
        })
    }
    
    setObserverBehavior(observer)
    // 定义subjectOne对observer的依赖
    observer.watchBy(subjectOne, "scroll")
    // 定义subjectTwo对observer的依赖
    observer.watchBy(subjectTwo, "scroll")
    
    // 当observer触发scroll事件的时候,subjectOne会响应这个事件
    subjectOne.notice = function (evt) {
        const { sender, receiver } = evt
        // do something
    }
    
    // 当observer触发scroll事件的时候,subjectTwo会响应这个事件
    subjectTwo.notice = function (evt) {
        const { sender, receiver } = evt
        // do something
    }

显然,在需要建立依赖关系不多的几个对象中,使用Observer模式可以很好的将不同对象之间进行解耦:定义一个被观察者的主体,然后添加观察者对被观察者的依赖关系。但是需要建立依赖关系的对象一旦多起来,那么大家也可以想象下,自己手动去维护这些依赖关系是多么的蛋疼。

Mediator中介者模式

基本的套路就是:提供一个中介对象Mediator,这个中介对象就是其他所有对象之间的联系纽带,其他所有对象相互之间没有没有任何的依赖关系,事件的订阅及发布统一让Mediator去操作。其他所有的对象需要做的就是提供给Mediator需要发布的事件,以及订阅Mediator上能提供的事件。

举个例子:

淘宝商铺:卖家A淘宝上开了一个Gopro相机店,b, c, d最近都有意愿去买Gopro,但是觉得价格稍贵,因此暂时不打算入手,想等价格稍微便宜一点后再入手,所以这3个人通过淘宝先关注卖家A的相机店。等到卖家AGopro相机打折后,淘宝会向这3个人推送打折消息。

其中这3个买家之间是没有任何依赖关系的,并不知道对方。当一个买家不打算买这家店的相机,取消关注后,对其他2个买家没有任何影响,唯一不同的是,卖家AGopro相机打折后,淘宝只会通知仍然关注卖家A的2个买家

在这个例子当中:

淘宝: Mediator

卖家A: 发布者

买家B/C/D: 订阅者

发布者通过Mediator去发布消息,Mediator再去通知其他的订阅者

简单的实现:

    class Mediator {
        constructor () {
            this.subscribers = {}
        }
        
        pubNotice (type, obj) {
            this.subscribers[type] = this.subscribers[type] || []
            this.subscribers[type].forEach(sub => {
                sub(obj)
            })
        }
        
        subNotice (type, target, fn) {
            this.subscribers[type] = this.subscribers[type] || []
            this.subscribers[type].push(fn)
        }
    }
    
    const sub1 = {
        sayHi(data) {
        console.log(`sub1 get the data ${data}`)
        }
    }

    const sub2 = {
        sayHi(data) {
            console.log(`sub2 get the data ${data}`)
        } 
    }

    const mediator = new Mediator()

    mediator.subNotice("sayHi", sub1, sub1.sayHi)
    mediator.subNotice("sayHi", sub2, sub2.sayHi)

    mediator.removeNotice("sayHi", sub2, sub2.sayHi)

    mediator.pubNotice("sayHi", "你好")

ObserverMediator实现的套路上来看,二者都有相似之处,就是订阅者订阅发布者发布的消息,但是Observer订阅者发布者直接产生依赖关系,当依赖关系变多起来就不好处理了。而Mediator是在订阅者发布者中间加了一个中介者,由这个中介者去管理不同对象之间的订阅发布关系,这样的好处就是订阅者发布者不产生直接的依赖关系,统一交给中介者去维护。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82638.html

相关文章

  • Design Pattern万剑归宗 => Mediator

    摘要:大意就是作者把种不断的重组归纳抽象直道最后抽象为一种设计模式,。而所有的关注的核心问题就是如何控制信息流但是我个人认为核心是如何解耦。再根据信息流划分出对象在系统中担任的种角色,。所以归为一种核心所有的的职责都是控制。 Overview 今天看了YouTube上的一个讲Design Pattern的视频,把这个视频的大意给大家分享一下,该视频的作者是Anthony Ferrara。 ...

    yuanzhanghu 评论0 收藏0
  • 行为型模式

    摘要:但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。因为访问者模式使得算法操作增加变得容易。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。 总体分为3大类:创建型模式 (5种):工厂方法、抽象工厂、单例、建造者、原型结构型模式(7种):适配器、装饰器、代理、外观、桥接、组合、享元行为型模式(11种...

    why_rookie 评论0 收藏0
  • 谈谈代码——如何避免写出糟糕if...else语句

    摘要:源码剖析之设计模式鉴赏策略模式小结在这篇文章中笔者和大家分享几个减少的小由于这些都会有一定的限制因此还向大家介绍了几个能够避免写出糟糕的的设计模式并使用观察者模式简单的改进了仲裁者模式的例子 本文首发于数据浮云:https://mp.weixin.qq.com/s?__... 在写代码的日常中,if...else语句是极为常见的.正因其常见性,很多同学在写代码的时候并不会去思考其在目...

    huhud 评论0 收藏0
  • 【编程课堂】Php设计模式(三):行为型模式

    摘要:代码实现迭代器模式注意被迭代对象属性是私有的观察者模式又叫发布订阅模式,当一个主体对象发生改变时,依赖它的多个观察者对象都得到通知并自动更新响应。 在上一篇我们讲了结构型模式,结构型模式是讨论类和对象的结构的。总共有7种。而今天我们来介绍一下行为型模式。 一、什么是行为型模式? 1、设计模式: 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计的总结。就好像杯子,是被前人设计出来...

    starsfun 评论0 收藏0
  • Java设计模式-中介者模式

    摘要:那在我们的程序设计中有没有这样的模式有的,中介者模式应运而生,目的就是处理这样的情景问题。最后来看客户端的实现,代码如下被攻打,请求支援可以看到,表面上请求还是从发出,但是已经委托了中介者进行业务逻辑和流程的处理。 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 小时候钟爱战争片,《地道战》、《鸡毛信》、《铁道游击队》一系列的老电影,咦~想起都激动得起鸡皮疙瘩。不过...

    SimonMa 评论0 收藏0

发表评论

0条评论

wapeyang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<