首页 > 其他分享 >18_观察者模式

18_观察者模式

时间:2024-03-14 10:12:03浏览次数:25  
标签:Observer 18 void 主题 观察者 模式 public Subject

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。

观察者模式有四个主要角色:

  1. 主题(Subject):定义了观察者的注册、删除和通知方法。主题可以是具体类或接口。

  2. 具体主题(Concrete Subject):继承或实现了主题,并实现了注册、删除和通知方法。具体主题内部维护了一个观察者列表,并在状态发生改变时通知观察者。

  3. 观察者(Observer):定义了更新方法,用于接收主题的通知并进行相应的处理。观察者可以是具体类或接口。

  4. 具体观察者(Concrete Observer):继承或实现了观察者,并实现了更新方法。具体观察者在接收到主题的通知后,执行相应的业务逻辑。

观察者模式的工作原理如下:

  1. 主题维护了一个观察者列表,可以在需要的时候注册、删除和通知观察者。

  2. 具体主题实现了主题接口,并在需要的时候调用观察者的更新方法。

  3. 观察者实现了观察者接口,并在接收到主题的通知后执行相应的更新操作。

观察者模式的优点包括:

  1. 解耦了主题和观察者之间的关系,使得它们可以独立地变化。

  2. 可以实现一对多的依赖关系,主题的状态改变时可以同时通知多个观察者。

  3. 可以方便地增加或删除观察者,扩展新的观察者类。

观察者模式适用于以下场景:

  1. 当一个对象的改变需要同时影响其他对象,并且不希望对象之间紧密耦合时,可以使用观察者模式。

  2. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,可以使用观察者模式。

总结而言,观察者模式通过定义对象之间的一对多依赖关系,实现了当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。它提供了一种松耦合的方式来处理对象之间的关系,并支持一对多的依赖关系。

 

案例场景:

猫大叫一声,老鼠赶紧逃跑,主人醒来开灯看看怎么回事?

猫就是主题角色(被观察者),老鼠和主人就是观察者角色。

 

Subject

/// <summary>
    /// 被观察者的抽象基类
    /// </summary>
    public abstract class Subject
    {
        private IList<Observer> _observers = new List<Observer>();//当前主题对象的观察者集合

        /// <summary>
        /// 添加观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Attach(Observer observer)
        {
            _observers.Add(observer);
        }

        /// <summary>
        /// 移除观察者
        /// </summary>
        /// <param name="observer"></param>
        public void Detach(Observer observer)
        {
            _observers.Remove(observer);
        }

        public void Nofity()
        {
            Console.WriteLine("猫突然大叫一声...喵...");

            foreach (var item in _observers)
            {
                item.Update();
            }
        }
    }

 

Observer

public abstract class Observer
    {
        public abstract void Update();
    }

 

Concrete Subject

public class Cat : Subject
    {
    }

 

Concrete Observer

public class Mouse : Observer
    {
        public override void Update()
        {
            Console.WriteLine("老鼠:快跑,被老猫发现了...");
        }
    }
public class Master : Observer
    {
        public override void Update()
        {
            Console.WriteLine("主人:我家的猫又叫了,开灯看看怎么回事?");
        }
    }

 

调用

internal class Client
    {
        public void Start()
        {
            Cat cat = new Cat();
            cat.Attach(new Mouse());
            cat.Attach(new Master());
            cat.Nofity();
        }
    }
static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

 

标签:Observer,18,void,主题,观察者,模式,public,Subject
From: https://www.cnblogs.com/MingQiu/p/18072203

相关文章

  • 17_状态模式
    状态模式是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。状态模式将对象的行为封装在不同的状态类中,通过改变状态类来改变对象的行为。状态模式有三个主要角色:环境类(Context):定义了一个状态对象的引用,并在需要的时候调用状态对象的方法。环境类可以根据内部......
  • 16_策略模式
    策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到独立的类中,使它们可以互相替换。策略模式使得算法可以独立于客户端而变化,客户端可以根据需要选择不同的算法。策略模式有三个主要角色:环境类(Context):它持有一个策略对象的引用,并在需要的时候调用策略对象的......
  • Java知识点之单例模式
    1、单例模式(BinarySearch)单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但......
  • 21_Java循环模式
    循环结构while循环do…while循环for循环在Java5中引入了一种主要用于数组的增强型for循环。while循环while是最基本的循环结构:While(布尔表达式){//循环内容}要求:只要布尔表达式为true,循环就会一直执行下去多数情况会让循环停止下来,需要一个让表达式失......
  • Win10开机进不了系统以及Win10系统进入安全模式解决方法
      今天小编和大家分享Win10开机进不了系统以及进入安全模式解决方法。欢迎大家关注收藏!Win10开机无法进入系统通常可以尝试以下解决方法:一.  进入启动设置界面,按下F4进入安全模式。二. 在安全模式下,按下“Win+R”组合键打开“运行”窗口,输入“msconfig”,点击“确定......
  • DevOps软件开发管理模式、CICD概念及其Jenkins使用
    一、什么是DevOpsDevOps是Develop与Operations的缩写,是开发和运营维护的总称。它是企业内开发、技术运营和质量保障这三方面工作的融合,用于促进开发、技术运营和质保部门之间的沟通、协作与整合。为巩固软件设计与开发结果,将开发、运维与测试结合一起,形成了DevOps软件开发管......
  • 代码随想录算法训练营第四十四天 | 377. 组合总和 Ⅳ ,518. 零钱兑换 II ,完全背包
    377.组合总和Ⅳ 已解答中等 相关标签相关企业 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合32位整数范围。 示例1:输入:num......
  • 跟着GPT学设计模式之桥接模式
    说明桥接模式,也叫作桥梁模式,英文是BridgeDesignPattern。在GoF的《设计模式》一书中,桥接模式是这么定义的:“Decoupleanabstractionfromitsimplementationsothatthetwocanvaryindependently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。”桥接模式......
  • 380. O(1) 时间插入、删除和获取随机元素.18071112
    380.O(1)时间插入、删除和获取随机元素实现RandomizedSet类:RandomizedSet()初始化RandomizedSet对象boolinsert(intval)当元素val不存在时,向集合中插入该项,并返回true;否则,返回false。boolremove(intval)当元素val存在时,从集合中移除该项,并返回true;否则......
  • CF1810G The Maximum Prefix
    ##题意构造一个长度最多为$n$的数组$a$,其每个元素均为1或-1。生成方式如下:·选择任意整数$k\in[1,n]$作为$a$的长度。·对于$\foralli\in[1,k]$,有$p_i$的概率设$a_i=1$,有$1-p_i$的概率设$a_i=-1$。在数列被生成后,计算$s_i=a_1+a_2+a_3+...+a_i$。特别地,$......