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

委托及观察者模式

时间:2023-06-25 13:33:24浏览次数:44  
标签:函数 委托 观察者 模式 类型 calc public 变量

委托

委托(delegate)是一种特殊的类型(class),它可以被认为是一个可以拥有函数引用的类,它的声明规定了它能够持有的函数引用的函数形式,同时它可以存储多个函数引用,并通过自己的方法调用所有注册在它身上的方法(发布者)。

理解了观察者模式就理解了委托

它的特点在于:

  1. 委托类型的定义方式通过特定关键字 delegate 来定义,而不是 class

image

  1. 我们无法为委托类型定义方法,它继承固定的类有固定的方法,这是发生在语言底层的

image

  1. 一个委托类型的变量时可以像一个普通类型的变量一样声明,但更好的方式是使用 event 关键字来修饰委托类型的变量,event 关键字包装了委托类型的变量(事件变量不是委托变量,它们是两个东西,尽管它们在声明方式上很像,事件变量包装了一个委托变量),这将避免从类外控制这个事件的发布(Invoke
namespace InterfaceTest
{
    [TestClass]
    public class DelegateTest
    {
        // 一个自定义的委托类型的变量,类比自定义的类的变量
        public event Function calc;

        [TestMethod]
        public void TestMethod1()
        {
            calc += () =>
            {
                return 0.0;
            };
            calc += DelegateTest.C;
            calc += new Function(C);
            calc = calc + C;
            calc.Invoke();
        }

        public static double C() { return 1.0;  }
    }

    // 委托是一个类型,所以它可以直接定义在名称空间下
    // 无法为委托类型自定义方法
    public delegate double Function();

    public class Caller
    {
        public Caller()
        {
            var dt = new DelegateTest();
            // 由于calc是一个event修饰的属性,所以从外部调用Invoke将引发异常
            dt.calc.Invoke(); // ERROR
        }
    }
}

外部访问event报错

  1. 就像我们可以直接使用语言本身提供的 string 类型一样,我们也可以直接使用语言本身提供的 ActionFunc 委托类型,它们已经包含了绝大多数可能的函数签名的形式,而无需自定义自己的 “MyString”

委托及观察者模式

image

在观察者模式中主要有四个事物:发布者、订阅者、“订阅”过程、“发布”过程。

发布者主要包含一个保存了订阅者引用的集合,在“发布过程”发生时,通过这个订阅者所持有的引用调用实现了相同接口的订阅者的方法(在这一步有多种方式,不一定非要是接口,目的在于使发布者能够通过多态统一保存所有的订阅者,从而在“发布”时遍历整个集合调用所有订阅者的方法。关于其它的实现方式可见引用.6)。

在委托中,观察者模式的这四个部分的实现如下:

  • 发布者:委托类型的变量

  • 订阅者:符合委托类型定义的函数签名的函数,表现形式有lambda表达式、直接定义的函数等(将函数当作一个函数类型的实例)

  • “订阅”:+ -,常见的形式是 += -=,本质上是委托类型重载了 +- 运算符

  • “发布”:

    1. 由系统负责“发布”,程序员提供发布时的动作(委托类型的函数):例如,WPF或Winform后置代码中的事件响应函数

    2. 由程序员负责“发布”,系统负责提供发布时的动作:例如,WPF中的OnPropertyChanged 在ViewModel中手动调用,但它上的函数的注册在XAML解析时完成

引用

  1. 《C#图解教程》
  2. 刘铁猛. C#语言入门详解
  3. learn.microsoft 如何组合委托
  4. MulticastDelegate.cs
  5. Delegate.cs
  6. 观察者模式

标签:函数,委托,观察者,模式,类型,calc,public,变量
From: https://www.cnblogs.com/bblitz/p/17502704.html

相关文章

  • vue项目本地启动history路由模式刷新页面404
    背景:之前一直用hash模式,改成history模式后刷新页面404解决:vue.config.js中publicPath:"/"如果是线上服务则还需要后端修改一些配置,见链接点击查看......
  • 大端模式与小端模式简介
    转载文章:《数据在内存中存储的方式:大端模式与小端模式》什么是大端模式,什么是小端模式?所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低......
  • JavaScript中最好的明暗模式主题切换
    了解如何使用JavaScript、CSS自定义属性、本地存储和系统设置为您的网站构建终极主题Toggle™️。无需框架!我曾经不同意浅色和深色模式切换。“切换开关是用户系统偏好设置!”我会天真地感叹,选择让prefers-color-schemeCSS媒体查询控制我个人网站上的主题。没有切换。没有选择......
  • Ubuntu开机默认进入命令行模式/用户图形界面(转)
    一、开机默认进入命令行模式  #输入命令: sudosystemctlset-defaultmulti-user.target #重启: reboot 要进入图形界面,只需要输入命令startx从图形界面切换回命令行:ctrl+alt+F7 二、开机默认进入图形用户界面  #输入命令: ......
  • Java 设计模式实战系列—策略模式
    从优惠打折活动说起电商平台为了增加销量经常搞一些活动,比如618、双十一,还有一些节假日活动,根据销量的变化又经常更新不同的活动。最开始为了增加销量,全场都六折://打六折publicBigDecimalsixDiscount(BigDecimalamount){BigDecimaldiscount=BigDecimal.valueOf(0......
  • c#学习笔记-------------------c#中的委托
    一、什么是委托委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。委托可以把函数做为参数传递,其实际意义便是让别人代理你的事情。委托可以看做是函数的指针,整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。我们可以选择将......
  • 设计模式之单例模式
    介绍单例模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。单例模式的八种方式1.饿汉式(静态常量)2.饿汉式(静态代码块)3.懒汉式(线程不安全)4.懒汉式(线程安全,同步方法)5.懒汉式(线程安全,同步代码块)6.......
  • pg基本基本概念——模式、表、空间、用户间的关系
    表空间用于定义数据库对象在物理存储设备上的位置,不特定于某个单独的数据库。数据库是数据库对象的物理集合,而schema则是数据库内部用于组织管理数据库对象的逻辑集合,schema名字空间之下则是各种应用程序会接触到的对象,比如表、索引、数据类型、函数、操作符等。角色(用户)则是......
  • Windows NT和Linux,采用了混合内核的设计模式 混合内核(Hybrid Kernel)是一种操作系统内
    混合内核(HybridKernel)是一种操作系统内核设计模式,它结合了微内核和宏内核两种设计理念的特点。混合内核旨在提供高性能和灵活性,同时保持较强的安全性和稳定性。混合内核在内核设计中将一些关键的服务和功能放在内核空间中,同时将其他非关键的服务和功能封装成独立的用户空间进程......
  • 单例模式_demo
    参考:(15条消息)单例模式Demo_zixing08的博客-CSDN博客单例模式详细解析-知乎(zhihu.com)Singleton.java1packagecom.hmb;23publicclassSingleton{4privatestaticclassMySingleton{5privatestaticSingletonsingleton=newSingleton......