说说设计模式~观察者模式(Observer)

简介:

观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。。

何时能用到它?

此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所以订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所以的订阅者就是它的观察者,发被观察者在某种情况被发起后,所以观察者的代码段 都将被执行。

而对于一个发邮件的功能来说,所有订阅了此功能的模块,只要系统到某个时间点,发邮件的事件就是被触发,此时,所有订阅了此功能的代码模块都会被执行,这种场合,我们见到的不少,如很多网站的新闻订阅,优惠订阅等等,都可以用到它。对于底层开发人员来说,你的CURD操作,如果希望在操作出错后,动态记录日志,事实上,也可以使用这个模式来实现,只要在WEB层或者BLL层订阅一下记录日志的事件即可。

观察者模式的结构图

观察者模式实现说明

SubjectBase:被观察者的基类,它包括了添加观察者,删除观察者,触发观察者的功能

Subject:其中一个被观察者

IObserver:被观察者对象接口,所以被观察者都要实现它,其中SubjectBase也会接收一个IObserver对象,用来触发所有观察者

Observer1:观察者1

Observer2:观察者2

观察者模式的C#实现

#region 观察者模式
    /// <summary>
    /// 被观察者基类
    /// </summary>
    public abstract class SubjectBase
    {
        private ArrayList _observers = new ArrayList();
        public void Add(IObserver o)
        {
            _observers.Add(o);
        }
        public void Remove(IObserver o)
        {
            _observers.Remove(o);
        }
        public void Notify()
        {
            foreach (IObserver o in _observers)
            {
                o.Notify();
            }
        }
    }
    /// <summary>
    /// 被观察者(委托)
    /// </summary>
    public class Subject : SubjectBase
    {

    }

    /// <summary>
    /// 观察者实现接口(事件)
    /// </summary>
    public interface IObserver
    {
        void Notify();
    }
    /// <summary>
    /// 观察者1
    /// </summary>
    public class Observer1 : IObserver
    {
        public void Notify()
        {
            Console.WriteLine("观察者1");
        }
    }
    /// <summary>
    /// 观察者2
    /// </summary>
    public class Observer2 : IObserver
    {
        public void Notify()
        {
            Console.WriteLine("观察者2");
        }
    }
    #endregion

测试代码

            Subject subject = new Subject();
            subject.Add(new Observer1());
            subject.Add(new Observer2());
            subject.Notify();

结果如图

本文转自博客园张占岭(仓储大叔)的博客,原文链接:说说设计模式~观察者模式(Observer),如需转载请自行联系原博主。

目录
相关文章
|
1月前
|
设计模式 消息中间件 存储
跟着GPT学设计模式之观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其依赖对象都能够收到通知并自动更新。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。
18 1
|
12天前
|
设计模式 存储 Java
Java设计模式之观察者模式详解
Java设计模式之观察者模式详解
|
12天前
|
设计模式
观察者模式-大话设计模式
观察者模式-大话设计模式
6 0
|
17天前
|
设计模式 存储
行为型设计模式之观察者模式
行为型设计模式之观察者模式
|
2月前
|
设计模式 Java
Java一分钟之-设计模式:观察者模式与事件驱动
【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。
33 1
|
2月前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
1月前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
177 0
|
2月前
|
设计模式 Go
[设计模式 Go实现] 行为型~观察者模式
[设计模式 Go实现] 行为型~观察者模式
|
2月前
|
设计模式 消息中间件 存储
【设计模式系列笔记】观察者模式
观察者模式是一种设计模式,它允许一个对象(主题)维护一组依赖于它的对象(观察者)并在状态发生变化时通知它们。这种模式属于行为型模式。在观察者模式中,主题是被观察的对象,而观察者是依赖于主题的对象,当主题的状态发生变化时,所有注册的观察者都会得到通知并自动更新。
35 0
|
2月前
|
设计模式 Java
小谈设计模式(15)—观察者模式
小谈设计模式(15)—观察者模式