设计模式系列 - 观察者模式

当对象之间存在一对多的关系时,若需要进行对象之间的通知,则可使用观察者模式

介绍

观察者模式属于行为型模式,当一个对象的状态发生改变时,若我们想通知其他对象,此时可通过观察者模式来进行解决。

类图描述

代码实现

1、定义抽象观察者

public abstract class Observer
{
    protected Subject subject;
    public abstract void Update();
}

2、定义观察者管理类

public class Subject
{
    private List<Observer> observers = new List<Observer>();

    private int state;
    public int GetState() => this.state;

    public void SetState(int state)
    {
        this.state = state;
        NitifyAllObservers();
    }

    public void Attach(Observer observer)
    {
        observers.Add(observer);
    }

    private void NitifyAllObservers()
    {
        foreach (var observer in observers)
        {
            observer.Update();
        }
    }
}

3、定义具体观察者

public class BinaryObserver : Observer
{
    public BinaryObserver(Subject subject)
    {
        this.subject = subject;
        this.subject.Attach(this);
    }

    public override void Update()
    {
        Console.WriteLine($"Binary string:{subject.GetState()}");
    }
}

public class HexaObserver:Observer
{
    public HexaObserver(Subject subject)
    {
        this.subject = subject;
        this.subject.Attach(this);
    }

    public override void Update()
    {
        Console.WriteLine($"Hex string:{subject.GetState()}");
    }
}

public class OctalObserver:Observer
{
    public OctalObserver(Subject subject)
    {
        this.subject = subject;
        this.subject.Attach(this);
    }

    public override void Update()
    {
        Console.WriteLine($"Octal string:{subject.GetState()}");

    }
}

4、上层调用

class Program
{
    static void Main(string[] args)
    {
        Subject subject = new Subject();

        new HexaObserver(subject);
        new OctalObserver(subject);
        new BinaryObserver(subject);
        Console.WriteLine("First state change:15");
        subject.SetState(15);
        Console.WriteLine("Second state change:10");
        subject.SetState(10);

        Console.ReadKey();
    }
}

总结

观察者模式通过一种集合方式将所有观察者管理起来,并最终循环遍历通知所有对象。

原文地址:https://www.cnblogs.com/hippieZhou/p/10093772.html

时间: 2024-08-01 13:34:43

设计模式系列 - 观察者模式的相关文章

Android设计模式系列--观察者模式

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下.本文以AbstractCursor为例子,展开分析.观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式. 1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.热门词汇:依赖 发布-订阅 事件 通知 更新 监听 2.结构 这是一个最简单的观察者模式

PHP设计模式系列 - 观察者模式

观察者模式 观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性.观察者设计模式非常常用,在一般复杂的WEB系统中,观察者模式可以帮你减轻代码设计的压力,降低代码耦合. 场景设计 设计一个订单类 订单创建完成后,会做各种动作,比如发送EMAIL,或者改变订单状态等等. 原始的方法,是将这些操作都写在create函数里面 但是随着订单创建类的越来越庞大,这样的操作已经无法满足需求和快速变动 这个时候,观察者模式出现了. 代码设计: <?php //观察者设计模

Java 设计模式系列(十六)观察者模式(Observer)

Java 设计模式系列(十六)观察者模式(Observer) 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 一.观察者模式的结构 Subject:目标对象,通常具有如下功能:

[转].NET设计模式系列文章

最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写好,那怕花上再多的时间也无所谓.本部分内容不断更新中. 目录计划: 第Ⅰ部分 开篇 开篇 第Ⅱ部分 创建型模式篇 第1章 单件模式(Single Pattern) 第2章 抽象工厂模式(Abstract Factory) 第3章 建造者模式(Builder Pattern) 第4章 工厂方法(Factory Method)

【设计模式】观察者模式

生活中,当某件事发生时,应该通知所有的相关者.例如,上课地点有变,要通知所有学习这门课的同学. 在软件设计中,当一个对象的状态发生变化是,如何通知与它相关的所有对象,就是我们今天要谈到的观察者模式. 观察者模式 概述 定义了一种一对多的依赖关系.让多个观察者对象同事监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己. 实际上,观察者模式所做的工作就是在解除耦合.让耦合的双方都依赖于抽象,而不是依赖于具体.从而使得各自的变化都不会影响另一边的变化. 结

设计模式(16) 观察者模式(OBSERVER)C++实现

意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 动机: 将一个系统设计成一系列相互协作的类有一个常见的副作用:需要维护相关对象之间的一致性. 观察者模式定义一种交互,即发布-订阅: 一个对象当自身状态发生改变时,会发出通知,但是并不知道谁是他的接收者,但每个接收者都会接收到通知,这些接受者称为观察者. 作为对通知的响应,每个观察者都将查询目标状态,然后改变自身的状态以和目标状态进行同步. 使用场景: 使对象封装为独立的改变和使用:

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

【设计模式】——观察者模式

观察者模式又叫发布-订阅(Publish/SubScribe)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. #include <iostream> #include <list> using namespace std; /*Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己. 这个接口叫做更新接口.抽象观察者一般用一个抽象类或者一个接口实现

.net设计模式之观察者模式

摘要     在今天的设计模式系列中我给大家带来了观察者模式,首先我会以一个生动的故事引入观察者模式的应用的场景,然后描述这个场景中出现的问题,最后我们提出观察者模式的解决方案,并给出C#语言实现的代码,最后以.net里的委托-事件方式的观察者模式作为结尾. 故事 小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出.男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦