观察者模式(利用委托)

1.添加三个类文件,定义三个类(猫、狗、老鼠)

  猫是主要事件

namespace MyDelegate
{
    public class Cat
    {
        public CatMiaoHandler CatMiaoHandlerMethod;//在Cat类实例化一个委托
        public void Miao()
        {
            Console.WriteLine("猫,叫一声");
            if (CatMiaoHandlerMethod!=null)//若委托不为空,执行委托
            {
                CatMiaoHandlerMethod();
            }
        }
    }
    public delegate void CatMiaoHandler();
}
namespace MyDelegate
{
    public class Dog
    {
        public static void Wang()
        {
            Console.WriteLine("狗,叫一声");
        }
    }
}
namespace MyDelegate
{
    public class Mouse
    {
        public static void Run()
        {
            Console.WriteLine("老鼠,跑");
        }
    }
}

2.当猫叫时,狗也叫,老鼠跑(这就是观察者模式)

  Program程序如下

namespace MyDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托
            cat.CatMiaoHandlerMethod += Mouse.Run;//多播委托,
            cat.Miao();
            Console.Read();
        }
    }
}

3.委托和事件的区别

namespace MyDelegate
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            //--------------------------对比----------------------------
            //cat.CatMiaoHandlerMethodEvent = new CatMiaoHandler(Dog.Wang); //此处会报错,事件不能实例化
            //cat.CatMiaoHandlerMethodEvent = null;//此处会报错,事件不能赋null值
            //cat.CatMiaoHandlerMethodEvent();//此处会报错,事件不能被外部调用
            //cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托可以实例化
            //cat.CatMiaoHandlerMethod = null;//委托可以赋值为null
            //cat.CatMiaoHandlerMethod();//委托可以直接调用
            //--------------------------总结---------------------------
            //委托不太安全,可能会被外部清除已经赋予的委托函数
            cat.CatMiaoHandlerMethod += Dog.Wang;
            cat.CatMiaoHandlerMethod += Mouse.Run;
            cat.Miao();
            //事件只能进行-=或+=赋值,不能进行=new或=null操作
            cat.CatMiaoHandlerMethodEvent += Dog.Wang;
            cat.CatMiaoHandlerMethodEvent += Mouse.Run;
            cat.Miao();

            Console.Read();
        }
    }
}

  另外,委托可以按委托调用函数的顺序查看委托函数,而事件查看不了

foreach(CatMiaoHandler s in cat.CatMiaoHandlerMethod.GetInvocationList())
{
  Console.WriteLine(s.Method);
}

原文地址:https://www.cnblogs.com/wskxy/p/9195519.html

时间: 2024-11-01 18:20:53

观察者模式(利用委托)的相关文章

C#中利用委托实现多线程跨线程操作

在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个问题有两种方法:一,是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的

常用设计模式之观察者模式 + 事件委托

常用设计模式之观察者模式 + 事件委托 作用及UML (摘自<大话设计模式>) Code 1 abstract class Subject{ 2 protected String state; 3 public void setState(String state){this.state = state;} 4 public String getState(){return this.state;} 5 6 private List<Observer> observers = ne

利用委托自定义事件

事件,这个大家都非常熟悉的名词,代码里几乎离不开它.但是我们平时都是用现成的事件,如果满足不了我们的需求怎么办?那就只能咱自己写了,那么问题就来了,如何自定义事件呢? 在这之前,我们就必须先了解事件与委托的干系是什么,只有弄清楚事物的本质,我们才能掌握住事物的灵魂. 我们先看看最常用的一个事件:Form_Load() public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs

利用委托实现自己的数据缓存仓库

Demo源码 背景 本来想聊聊本文产生的背景的,后来发现本码农词穷了.因此,直入主题,本文的工作是利用委托实现了一个全局的数据缓存仓库. 这个类库接收4个参数:1 您要存储的数据的数据类型 2 获取需要存储数据的方法 3 过期的时间 4 读取该数据的唯一key 这个类库就能够:根据key获取数据,数据通过执行您传入的获取数据的方法来获得,当上一次获取的时间过期后,会重新执行获取数据的方法以更新数据! 推荐的使用方式:1 在应用程序的开端,进行所有需要缓存数据的初始化操作,统一管理所有的key:这

C#中利用委托创建窗体单向通信

初学者在开始学习的时候,对于委托很难做到一下子理解,其中也包括我.委托好比一座大山,没爬上山顶就不能有"一览众山小"的感觉,只有你真正的爬到山顶的时候,才会发现大自然的是神奇. 委托我们可以把它认为是一个类,而不是一个方法.用委托我们可以调用方法,来简化程序,非常像C++中的指针. 使用委托的一般步骤为: (1)定义委托,delegate 返回值类型 委托类型名称(参数列表): (2)声明方法: (3)实例化委托,注意声明的类型要和方法中的类型一样. 下面给出例子,利用委托创建窗体单向

Unity中利用委托与监听解耦合的思路

这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需要有一个按钮和一个Text,当按下按钮时,Text上显示“你好”两个字. 一个最常见的方法是在按钮下挂载一个脚本BtnClick,它持有一个Text组件,它由外部的Text拖入来赋值. 在初始化时BtnClick会获取当前游戏物体下的Button组件并为其添加监听,当按下按钮时会修改Text组件中的

C#固定时间执行指定事件(观察者模式+异步委托)

最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指教. 关于观察者模式,我在这里就不做讲解了,如有不懂,可以参考相关文章. 那么开始入正题. 主要有三个页面:Observer.cs(观察者).Subject.cs(通知者).Form1.cs Observer.cs class Observer { /// <summary> /// 执行事件A

一场武林盟主争霸赛-观察者模式PK委托事件技术

设计模式中提到观察者模式又叫做发布-订阅(Publish-订阅)模式.它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有 观察者对象,使它们能够自动更新自己. C#中提到,委托是对函数的封装,可以当作给方法的特征指定一个名称.而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程.事件其实就是设计模式中观察者模式在.NET中的一种实现方式. 委托就是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的

C#设计模式 - 观察者模式(使用委托)

1.概念 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 2.角色 2.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者.抽象主题提供一个接口,可以增加和