c#观察者模式和事件委托的联合使用

2023-11-12

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

//观察者模式和事件委托的联合使用
namespace 委托和事件2
{
    //热水器的类,被监视的对象
    public class Heater
    {
        private int temperature;//水温
        public delegate void heatEventHandler(int para);
        public event heatEventHandler heat;  //声明事件 事件的命名为委托去掉EventHandler之后的部分
        //烧水
        public void boilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature >= 98)
                {
                    if (heat != null) //有方法注册进事件中
                    {
                        heat(temperature); //在条件满足的情况下通知观察者
                    }
                }
            }

        }
    }

    //警报类,observer的角色
    public class Alarm
    {
        public void boilVoice(int para)
        {
            Console.WriteLine("嘀嘀嘀");
        }
    }
    //显示类。显示水温,observer的角色
    public class Show
    {
        public void ShowTemperature(int para)
        {
            Console.WriteLine("水温已经{0}度了",para);
        }
    }

    //
    class Program
    {
        static void Main(string[] args)
        {
            Heater heater = new Heater();
            Alarm alarm = new Alarm();
            Show show = new Show();
            heater.heat += alarm.boilVoice;
            heater.heat += show.ShowTemperature;
            heater.boilWater();
            Console.Read();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 事件访问器
{
    //定义委托
    public delegate string GeneralEventHandler();
    //定义事件的发布者
    public class Publisher
    {
        private GeneralEventHandler _delegate;
        public event GeneralEventHandler geneal //事件访问器的定义
        {
            add { _delegate = value; }
            remove { _delegate -= value; }
        }
        public void DoSomething()
        {
            if (_delegate != null)
            {
                string str = _delegate();
                Console.WriteLine(str);
            }
        }
    }
    //定义事件的订阅者
    public class Subscriber
    {
        public string method()
        {
            return "liK";
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Publisher ps = new Publisher();
            Subscriber sb = new Subscriber();
            ps.geneal += sb.method;
            ps.DoSomething();
            Console.Read(); 
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托和事件返回值研究
{
    public delegate string testEventHandler();
    class AA
    {
        public testEventHandler test;
        public void method()
        {
            if (test != null)
            {
                Console.WriteLine(test());
            }
        }
    }
    class BB
    {
        public static string bb()
        {
            return "likang01";
        }
    }
    class CC
    {
        public static string cc()
        {
            return "likang02";
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AA aa = new AA();   //委托变量可以供对个订阅者注册,如果定义了返回值,那么对个订阅者都会向发布者返回数值
            aa.test = BB.bb;    //结果就是后面的一个返回值将前面的返回值覆盖了,实际上只能获得最后一个方法调用的返回值
            aa.test += CC.cc;
            aa.test -= CC.cc;
            aa.method();
            Console.Read();
        }
    }
}

这篇文章是学习博客园一位大神的笔记吧,大神还写了事件和委托的高级篇,无赖不甚理解,暂时不上了,要看的直接访问http://www.cnblogs.com/JimmyZhang/archive/2008/08/22/1274342.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c#观察者模式和事件委托的联合使用 的相关文章

随机推荐

  • QNX驱动开发—进程调度和进程通信

    锋影 e mail 174176320 qq com QNX进程间调度和进程通信切换任务 一 进程调度方法 1 FIFO 先进先出队列法 一个最高优先级的线程可以一直执行到结束或是主动放弃CPU 高优先级的线程可以随时中断低优先级的线程 获
  • unity中UI界面的一些动画实现总结

    在做unity的ui界面的时候 美术通常会实现一些动画效果 这里列举几个 1 位置的变化 2 旋转的变化 3 缩放的变化 4 alpha的变化 5 颜色的变化 我们举一个例子 位置的变化 1 target为作用的对象 2 curve为曲线变
  • 【Java】高并发-线程中断的几种方式

    线程中断的几种方式 1 通过一个变量控制线程中断 代码中启动了一个线程 线程的run方法中有个死循环 内部通过exit变量的值来控制是否退出 TimeUnit SECONDS sleep 3 让主线程休眠3秒 此处为什么使用TimeUnit
  • ubuntu software center have problems,it cannot run.

    When I update my ubuntu 11 10 I meet this problem like following Items cannot be installed or removed until the package
  • spring使用xml进行声明式事务管理

  • 最全讲解磁珠

    1 磁珠的定义 磁珠是一种被动组件 用来抑制电路中的高频噪声 磁珠是一种特别的扼流圈 其成分多半为铁氧体 利用其高频电流产生的热耗散来抑制高频噪声 磁珠有时也称为磁环 EMI滤波器 铁芯等 维基百科 磁珠是滤波常用的器件 铁 镍 锌氧化物混
  • 线程池ThreadPoolExecutor之阻塞队列

    在近期的性能优化中 使用了线程池 线程池的定义如下 ExecutorService executorService new ThreadPoolExecutor threadPoolSize threadPoolMaxSize timeou
  • get请求、post请求区别

    991 GET请求一般用去请求获取数据 是无副作用的 是幂等的 POST一般作为提交数据到后台时使用 有副作用 非幂等 2 GET请求也可传参到后台 但是其参数在浏览器的地址栏的url中可见 所以隐私性安全性较差 且参数长度也是有限制的 P
  • C++(day7)

    思维导图 Vector include
  • 关于Jquery的Validate插件------rules规则说明

    Query Validate 插件为表单提供了强大的验证功能 让客户端表单验证变得更简单 同时提供了大量的定制选项 满足应用程序各种需求 该插件捆绑了一套有用的验证方法 包括 URL 和电子邮件验证 同时提供了一个用来编写用户自定义方法的
  • DevOPs介绍,这一篇就足够了

    一 什么是DevOps DevOps是一种将软件开发和IT运维进行整合的文化和运动 它的目标是通过加强软件开发 测试和运维之间的协作和沟通 使整个软件开发和交付过程更加高效 快速 安全和可靠 DevOps涵盖了从计划和设计到开发 测试 交付
  • C语言动态内存管理

    目录 1 函数栈空间 1 1栈上的内存分配 2堆上的内存分配 2 1堆区分配内存的特点 2 2申请空间的操作 2 2 1malloc 2 2 2calloc 2 2 3realloc 2 3申请空间操作的技巧 1 函数栈空间 首先我们需要清
  • 实验---采用SOM网络进行聚类

    1 SOM网络简介 自组织特征映射网络SOFM又称自组织映射网络SOM 是一种自组织竞争神经网络 一个神经网络接受外界输入模式时 将会分为不同的对应区域 各区域对输入模式具有不同的响应特征 而且这个过程是自动完成的 其特点与人脑的自组织特性
  • 快速实现M5311NBIOT MQTT通信

    NBIOT MQTT接入ONE NET云平台 一 本例程实现功能介绍 三 硬件接线图 材料清单 四 完整代码 代码解析 前言 MQTT是一种基于TCP的物联网通信协议 在物联网领域应用非常广泛 基本上所有的云平台都支持设备以MQTT协议接入
  • 如何看懂照片的直方图?

    直方图的观看规则就是 左黑右白 左边代表暗部 右边代表亮部 而中间则代表中间调 纵向上的高度代表像素密集程度 越高 代表的就是分布在这个亮度上的像素很多 上图为例 对于一张 正常 的照片来说 直方图应该是中间高两边低 amp lt img
  • 龙芯笔记

    1 用交叉编译器编译时 也会出现找不到sqlite3 h头文件的情况 需要把sqlite3 h这个头文件放到交叉编译工具目录下的 include 2 mips64el redhat linux g sqlite c lm o sql tes
  • SVM 二分类与模型评估参数

    code 正常输出中文 import io import sys sys stdout io TextIOWrapper sys stdout buffer encoding utf 8 Accuracy AUC Recall Precis
  • 电脑连接KONICA MINOLTA(柯尼卡美能达) 打印机及驱动安装

    电脑系统 Windows 7 安装的打印机型号 Konica minolta bizhub 363 驱动下载 https www konicaminolta com cn support drivers index html 打印机配置好网
  • 财务模块 - 采购、接收、应付会计分录和功能认识

    一 企业采购业务 采购业务是一般企业都会有的业务 主要包括请购 采购 接收 入库 发票 付款几个步骤 分别对应采购 库存 成本 应付以及总账模块 Oracle是财务业务一体化的系统 只要录入了相应的业务 则会自动生成相应的财务信息 1 采购
  • c#观察者模式和事件委托的联合使用

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks 观察者模式和事件委