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

观察者模式

时间:2024-01-22 16:37:46浏览次数:31  
标签:void 观察者 模式 System UserSystem using public

C#设计模式】16.观察者模式(Observer Pattern)【行为型】

介绍

  “观察者模式”在现实生活中,实例其实是很多的,比如:八九十年代我们订阅的报纸,我们会定期收到报纸,因为我们订阅了。银行可以给储户发手机短信,也是“观察者模式”很好的使用的例子,因为我们订阅了银行的短信业务,当我们账户余额发生变化就会收到通知等等。

 

 

  意图:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

 

模式的组成

可以看出,在观察者模式的结构图有以下角色:

(1)抽象主题角色(Subject):抽象主题把所有观察者对象的引用保存在一个列表中,并提供增加和删除观察者对象的操作,抽象主题角色又叫做抽象被观察者角色,一般由抽象类或接口实现。

(2)抽象观察者角色(Observer):为所有具体观察者定义一个接口,在得到主题通知时更新自己,一般由抽象类或接口实现。

(3)具体主题角色(ConcreteSubject):实现抽象主题接口,具体主题角色又叫做具体被观察者角色。

(4)具体观察者角色(ConcreteObserver):实现抽象观察者角色所要求的接口,以便使自身状态与主题的状态相协调。

 

例程

  用邮局订报做例子。

两个接口

PostOfficeSystem:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern.观察者模式.测试
{
    /// <summary>
    /// 抽象主题角色,邮局接口
    /// </summary>
    internal interface PostOfficeSystem
    {
        /// <summary>
        /// 用户订阅
        /// </summary>
        void Add(UserSystem user);

        /// <summary>
        /// 取消订阅
        /// </summary>
        void Remove(UserSystem user);

        /// <summary>
        /// 通知用户
        /// </summary>
        void Notify();
    }
}

UserSystem:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern.观察者模式.测试
{
    /// <summary>
    /// 抽象观察者角色,用户
    /// </summary>
    internal interface UserSystem
    {
        void Update();
    }
}

 

两个实现类:

邮局PostOffice:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern.观察者模式.测试
{
    /// <summary>
    /// 具体主题角色,邮局
    /// </summary>
    internal class PostOffice : PostOfficeSystem
    {
        public List<UserSystem> users;

        public PostOffice()
        {
            users = new List<UserSystem>();
        }

        /// <summary>
        /// 用户订阅
        /// </summary>
        /// <param name="user"></param>
        public void Add(UserSystem user)
        {
            users.Add(user);
        }

        /// <summary>
        /// 通知用户
        /// </summary>
        public void Notify()
        {
            foreach (var user in users)
            {
                user.Update();
            }
        }

        /// <summary>
        /// 用户取消订阅
        /// </summary>
        /// <param name="user"></param>
        public void Remove(UserSystem user)
        {
            users.Remove(user);
        }
    }
}

 用户类User:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern.观察者模式.测试
{
    internal class User : UserSystem
    {
        public string UserName, Newspaper;
        public User(string UserName, string Newspaper)
        {
            this.UserName = UserName;
            this.Newspaper = Newspaper;
        }
        public void Update()
        {
            Console.WriteLine($"用户{UserName}购买的{Newspaper}已到货......");
        }
    }
}

 

输出:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesignPattern.观察者模式.测试
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            UserSystem user1 = new User("小明", "《三国演义》");
            UserSystem user2 = new User("小华", "《水浒传》");
            UserSystem user3 = new User("小亮", "《红楼梦》");

            PostOfficeSystem postOffice = new PostOffice();
            postOffice.Add(user1);
            postOffice.Add(user2);
            postOffice.Add(user3);

            postOffice.Notify();

            Console.ReadLine();
        }
    }
}

 

结果:

 

标签:void,观察者,模式,System,UserSystem,using,public
From: https://www.cnblogs.com/shieryoufeng/p/17980280

相关文章

  • 模板模式
    定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现补充:模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤类型:行为型适用场景:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现各子类中公共的行为被提取出来并集中到一个公共父类......
  • 设计模式(二十二)模板方法
    一、定义定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的特定步骤。模板方法是一种类行为型模式二、描述模板方法模式结构比较简单,其核心是抽象类和其中的模板方法的设计,包含以下两个角色:1、AbstractClass(抽......
  • 设计模式
    八大原则:依开单替,接优封针依:依赖倒置原则高层次的代码不应该依赖低层次的代码,应该依赖抽象、抽象的代码不应该依赖具体的代码开:开闭原则对扩展开放,对修改关闭单:单一职责一个类应该仅有一个变化的原因,该变化隐含了它的职责,职责太多会造成混乱替:替换原则子类必须能够替换他......
  • js设计模式之命令模式
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>命令模式</title></head><body><buttonid="btn1">刷新菜单</button><buttonid="btn2">增......
  • keil的调试模式debug
    (1)工程选项,debug这里可以对调试选项进行配置(2)左边的是使用仿真器,右边是默认的在硬件上在线仿真(3)编译一下工程确保没有问题(4)然后点击这里的放大镜里面带各地的图标,进入调试模式(5)主窗口是我们C语言程序,上面的窗口就是C语言翻译成的汇编程序,然后左边这个窗口是寄存器组和状态标志......
  • 懒汉单例模式
    1publicclassSingleInstance{2/**3*懒汉单例模式:当真正需要该对象的时候,才去创建一个对象(延迟加载对象)4*1.定义一个类,把构造器私有5*2.定义一个静态变量存储一个对象6*3.提供一个返回单例对象的方法7*/8//......
  • Seata 2.x 首个版本正式发布,支持 Raft 集群模式
    作者:Seata社区用户登记欢迎已使用用户在此链接登记,便于我们更好的针对业务场景优化:https://github.com/seata/seata/issues/12462.x Roadmap发布概览2.0.0中对大家期待已久的Raft集群模式做了支持,Raft集群模式消除了对第三方注册中心和Seata-Server后端存储的依赖,......
  • 饿汉单例模式示例
    1publicclassSingleInstance{2/*3饿汉单例模式:在用类创建对象的时候,对象就已经准备好了41.定义一个类,把构造器私有52.定义一个静态变量存储一个对象6*/7publicstaticSingleInstanceinstance=newSingl......
  • 代理模式
    定义:为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介作用类型:结构型适用场景:保护目标对象增强目标对象优点:代理模式能将代理对象与真实被调用的目标对象分离一定程度上降低了系统的耦合度,扩展性好保护目标......
  • 设计模式—行为型模式之观察者模式
    设计模式—行为型模式之观察者模式观察者模式(ObserverPattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模......