设计模式之观察者(发布订阅)模式

这篇具有很好参考价值的文章主要介绍了设计模式之观察者(发布订阅)模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己
设计模式之观察者(发布订阅)模式,设计模式

  class Program
    {
        static void Main(string[] args)
        {
            ConcreteSubject concreteSubject = new ConcreteSubject();

            concreteSubject.Attach(new ConcreteObserver(concreteSubject, "奶茶店"));
            concreteSubject.Attach(new ConcreteObserver(concreteSubject, "快餐店"));
            concreteSubject.Attach(new ConcreteObserver(concreteSubject, "花店"));

            concreteSubject.SubjectState = "顾客来了";
            concreteSubject.Notify();//消息通知
            Console.ReadLine();
        }
    }

    //抽象消息通知者,一般用一一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存在一个容器里,每个消息通知者都可以联系任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象
    abstract class Subject
    {
        private IList<Observer> observers = new List<Observer>();//观察者列表

        //增加观察者
        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        //移除观察者
        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }

        //将消息通知给所观察者
        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }


    }

    //抽象观察者,是所有观察者的基类,在得到消息发布者的消息后,使用更新方法更新自己的状态
    abstract class Observer
    {
        public abstract void Update();
    }


    //具体消息通知者,继承自Subject的具体类,将有关状态存入具体观察者对象;在具体消息通知者内部状态改变的时候,给所有在容器中的观察者发布消息。
    class ConcreteSubject : Subject
    {
        private string subjectState;//消息通知者的具体消息

        //具体被观察者状态
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }


    //具体观察者,实现抽象观察者的接口,以便本身的状态与消息通知者的状态相协调
    class ConcreteObserver : Observer
    {
        private string name;
        private string observerState;
        private ConcreteSubject subject;

        public ConcreteObserver(ConcreteSubject subject, string name)
        {
            this.subject = subject;
            this.name = name;
        }

        public override void Update()
        {
            observerState = subject.SubjectState;
            Console.WriteLine("{0}的新状态是{1}",name,observerState);
        }

        public ConcreteSubject Subject
        {
            get { return subject; }
            set { subject = value; }
        }


    }

观察者模式主要解决的问题:当一个对象状态发生改变后给其他的对象通知

观察者的优点:
观察者和被观察者是抽象耦合的,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

观察者的缺点:
1、如果一个被观察者对象有很多的直接或间接的观察者的话,消耗的时间会增加很多。

2、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅是知道被观察者发生变化,会有很一些不需要改变状态的观察者被迫发生状态改变。

3、如果观察者与被观察者之间有循环依赖,会造成陷入死循环中,导致系统崩溃。


观察者模式的变体—— 发布订阅模式

发布订阅模式需要引用到了事件与委托这个两种类型

委托
事件

订阅发布模式,发布者的消息发送者不会讲消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个组件,称为消息代理或调度中心和中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地发布它们给订阅者。

优点
1、支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象
2、发布者与订阅者耦合性降低,发布者只管发布一条消息后,订阅者只监听发布者的事件名,只要发布者的事件名不变,它不管发布者如何改变

缺点
1、创建订阅者需要消耗一定时间的内存
2、增加维护的难度

区别与联系
联系:
订阅发布是观察者模式的一种变种。
区别:
1、观察模式中观察者和被观察者是松耦合的关系、发布-订阅模式中完全不存在耦合。
2、观察模式中观察者与被观察者相互感知,发布-订阅模式中存在中间调度工厂。文章来源地址https://www.toymoban.com/news/detail-731204.html

class Program
    {
        static void Main(string[] args)
        {
            Client c1 = new Client();

            ObserverA a = new ObserverA("路北", c1);
            ObserverB b = new ObserverB("路南", c1);

            c1.Update += new Handler(a.Work);
            c1.Update += new Handler(b.Work);

            c1.SubjectState = "顾客";
            c1.Notify();
        }
    }


    interface Subject
    {
       public void  Notify();
        string SubjectState
        {
            get;
            set;
        }
    }



    delegate void Handler();//声明委托
    class Client : Subject
    {
        public event Handler Update;//声明Handler(事件处理程序)的委托事件Update方法

        private string action;

        public void Notify()//引发Update方法
        {
            Update();
        }

        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }

 
    }
    class ObserverA
    {
        private string name;
        private Subject subject;
        public ObserverA(string name, Subject subject)
        {
            this.name = name;
            this.subject = subject;
            
        }

        public void Work()
        {
            Console.WriteLine("{0}来了,{1}开始工作",subject.SubjectState,name);
        }
    }

    class ObserverB
    {
        private string name;
        private Subject subject;
        public ObserverB(string name, Subject subject)
        {
            this.name = name;
            this.subject = subject;

        }

        public void Work()
        {
            Console.WriteLine("{0}来了,{1}开始工作", subject.SubjectState, name);
        }
    }

到了这里,关于设计模式之观察者(发布订阅)模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++之观察者模式(发布-订阅)

    目录 模式简介 介绍 优点 缺点 代码实现 场景说明 实现代码 运行结果 观察者模式( Observer Pattern ) ,也叫我们熟知的 发布-订阅模式。 它是一种 行为型模式。 介绍 观察者模式主要关注的是对象的一对多的关系, 也就是多个对象依赖于一个对象,当该对象的 状态发生改变

    2024年02月15日
    浏览(46)
  • 观察者模式、中介者模式和发布订阅模式

    观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新 观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯 例如生活中,我们可以用报

    2024年02月15日
    浏览(49)
  • JavaScript 简单实现观察者模式和发布-订阅模式

    大家好,我是南木元元,热衷分享有趣实用的文章。今天来聊聊设计模式中常用的观察者模式和发布-订阅模式。 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 如何理解这句话呢?来举个生活中的例子

    2024年02月12日
    浏览(106)
  • 从Vue层面 - 解析发布订阅模式和观察者模式区别

    观察者模式和发布订阅模式作为日常开发中经常使用到的模式,我一直不能做到很好的区分。最近在看Vue的源码,里面设计到了观察者模式,比较感兴趣,就去学习了下,这里做个总结吧。 基于一个 事件中心 ,接收通知的对象是订阅者,需要先订阅某个事件,触发事件的对

    2024年02月15日
    浏览(45)
  • 【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式

    🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 👉

    2023年04月08日
    浏览(95)
  • 【设计模式】观察者模式

    观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 Subject:抽象主题(被观察者

    2024年02月13日
    浏览(52)
  • 设计模式——观察者模式

    观察者模式可以分为观察者和被观察者,观察者通过注册到一个被观察者中,也可视为订阅,当被观察者的数据发生改变时,会通知到观察者,观察者可以据此做出反应。 可以类比订阅报纸,报社就是被观察者,订阅者就是观察者,订阅者通过订阅报纸与报社建立联系,而报

    2024年02月15日
    浏览(53)
  • 设计模式-观察者模式

    观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者

    2024年02月15日
    浏览(58)
  • 设计模式---观察者模式

    1,概念         属于行为模式的一种,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一对象主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),

    2024年02月15日
    浏览(65)
  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包