首页 > 其他分享 >设计模式之 Observer Pattern观察者模式

设计模式之 Observer Pattern观察者模式

时间:2023-10-10 12:00:41浏览次数:37  
标签:Observer 对象 Pattern void 观察者 NumberGenerator 设计模式 public

观察者模式
Observer
    Observer模式为组件向相关接收方【广播】消息提供了灵活的方法;
    该模式定义了对象一到多的依赖关系,这样当对象改变状态时,将自动通知并更新他所有的依赖对象;
    优点
        抽象了主体与Observer之间的耦合关系;
        支持广播方式的通信
    适用
        对一个对象的修改涉及其他对象的修改,而且不知道有多少对象需要进行修改;
        对象应该能够在不用假设对象标识的前提下,通知其他对象;

 

示例代码

 /// <summary>
    /// 数字生成器类
    /// </summary>
    public class NumberGenerator
    {
        /// <summary>
        /// 存储随机生成的数字
        /// </summary>
        public int Number { get; private set; }
        /// <summary>
        /// 存储观察者
        /// </summary>
        private List<Observer> observers = new List<Observer>();
        /// <summary>
        /// 添加(注册)观察者
        /// </summary>
        /// <param name="observer"></param>
        public void AddObserver(Observer observer) => observers.Add(observer);。
        /// <summary>
        /// 删除(取消注册)观察者
        /// </summary>
        /// <param name="observer"></param>
        public void RemoveObserver(Observer observer) => observers.Remove(observer);
        /// <summary>
        /// 通知观察者,也就是逐个调用所有观察者的方法
        /// </summary>
        private void NotifyObservers()
        {
            foreach (var o in observers)
            {
                o.Update(this);
            }
        }
        /// <summary>
        /// 随机生成数字
        /// </summary>
        public void Execute()
        {
            Random r = new Random();

            while (true)
            {
                Number = r.Next(1, 10);
                NotifyObservers();
            }
        }
    }
    /// <summary>
    /// 观察者接口
    /// </summary>
    public interface Observer
    {
        void Update(NumberGenerator numberGenerator);

    }
    /// <summary>
    /// 数字观察者,打印数字
    /// </summary>
    public class DigitalObserver : Observer
    {
        public void Update(NumberGenerator numberGenerator)
        {
            Console.WriteLine($"更新数字:{numberGenerator.Number}");
            Thread.Sleep(100);
        }
    }
    /// <summary>
    /// 图形观察者,按数字打印对应个数的符号
    /// </summary>
    public class GraphObserver : Observer
    {
        public void Update(NumberGenerator numberGenerator)
        {
            Console.Write("更新符号:");
            for (int i = 0; i < numberGenerator.Number; i++)
            {
                Console.Write("*");
                Thread.Sleep(100);
            }
            Console.WriteLine();
        }
    }
    

/// <summary>
        /// 观察者模式 测试函数
        /// </summary>
        public static void ObserverPatternTest()
        {
            //数字生成器
            NumberGenerator generator = new NumberGenerator();
            //创建观察者对象
            DigitalObserver digitalObserver = new DigitalObserver();
            GraphObserver graphObserver = new GraphObserver();
            //添加(注册)观察者对象
            generator.AddObserver(digitalObserver);
            generator.AddObserver(graphObserver);
            //执行(生成随机数,并通知观察者进行打印)
            generator.Execute();
        }

 

标签:Observer,对象,Pattern,void,观察者,NumberGenerator,设计模式,public
From: https://www.cnblogs.com/zhangdezhang/p/17754320.html

相关文章

  • Java设计模式之工厂设计模式
    1.1.概述需求:设计一个咖啡店点餐系统。设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类的设计如下: 在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new......
  • 【愚公系列】2023年10月 二十三种设计模式(八)-组合模式(Composite Pattern)
    ......
  • 设计模式分类(背)
           ......
  • Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】
    〇、简介1、什么是桥接模式?一句话解释:  通过一个类的抽象,与另一个类的抽象关联起来,当做桥。此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来。桥接,顾名思义就是用桥来连接河两岸,将原本不关联的两部分联系起来,且不影响两岸的各自演化,演化出来的不同对......
  • Java设计模式之适配器模式
    1.1.概述如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很......
  • 工厂设计模式
      Spring底层框架就用到工厂方法模式 ......
  • 责任链设计模式
    过滤器   ......
  • 学习笔记-设计模式-创建型模式-单例模式
    单例模式一个类只有一个实例,并提供一个全局访问此实例的点,哪怕多线程同时访问。单例模式主要解决了一个全局使用的类被频繁的创建和消费的问题。单例模式的案例场景数据库的连接池不会反复创建spring中一个单例模式bean的生成和使用在我们平常的代码中需要设置全局的一些属......
  • Java设计模式之建造者模式
    1.1.概述将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。• 分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。• 由于实现了构建和装配的解耦。不同的构建器,相......
  • 设计模式 (1): 5 种创建型模式 (结合代码详解)
    目录1单例模式饿汉单例懒汉单例双重检验单例静态内部类单例破坏单例(反射、反序列化)枚举类单例2工厂模式简单工厂模式工厂方法模式3抽象工厂模式代码实现对比三种工厂模式如何选择工厂方法和抽象工厂?4建造者模式5原型模式1单例模式需考虑的问题:是否线程安全是否延......