事件(_观察者模式)

一个类如果声明一个Public的委托让其他方法注册,同样也会存在外部直接调用此委托,这样是有会出现莫名的调用风险的。因此就有了事件,事件无法在外部直接调用。外部只有注册(定阅)。内部进行发布。

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

namespace 事件_观察者模式_
{
    class Program
    {
        static void Main(string[] args)
        {
            CAT cat = new CAT("TOM","黄色");
            Mouse mouse1 = new Mouse("米奇1", "黑1色",cat);
            Mouse mouse2 = new Mouse("米奇2", "黑2色", cat);
            Mouse mouse3 = new Mouse("米奇3", "黑3色", cat);
            cat.CatComing();
            // cat.CatCome();这如果不是一个事件,是可以在外面调用的,是事件则不能调用。
            Console.ReadKey();
        }
    }
}
    class CAT
    {
        public string name;
        public string color;
        public CAT(string name,string color)
        {
            this.name = name;
            this.color = color;
        }
        public void CatComing()
        {
            Console.WriteLine(color+"的"+name+"进来了!");
            CatCome();
        }
        public event Action CatCome;//这代表示这个CAT类中的事件发布
    }
}

class Mouse
{

public string name;

public string color;
        public Mouse(string name,string color,CAT cat)
        {
            this.name = name;
            this.color = color;
            cat.CatCome += RunAway;//这表示Mouse类中定阅cat.CatCome(也就是将RunAway()注册到CAT类中的cat.CatCome事件中),
        }
        public void RunAway()
        {
            Console.WriteLine(color+"的"+name+"跑了!");
        }
时间: 2024-10-21 10:24:59

事件(_观察者模式)的相关文章

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

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

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

OO设计模式_观察者模式

Motivation: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”————一个对象(目标对象)的状态发生改变,所有的依赖对象(观察这对象)都将得到通知.如果这样的依赖关系过于紧密,将是软件不能很好的抵御变化. 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. Intent: 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生变化,所有依赖于它的对象都得到通知并自动更新. Code: 1.不使用设计模式编程. //不使用设

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一  双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get;

[设计模式]_[观察者模式在项目中实际使用例子]

场景: 1. 比如在界面开发中,多个窗口之间需要通讯,比较常见的方法就是各个窗口之间包含对其他窗口的引用,之后在需要时通过其他窗口的引用来调用相应的函数获取相应的值: 但是这个确定还是比较明显的,就是会造成窗口之间的依赖和耦合,想想测试或变异某个窗口时另一个窗口必须是没问题的,而另一个窗口编译又依赖它,这样成了反复依赖 导致编译不过或修改其中一个另一个就得相应的该.很麻烦,不好维护. 2. 还有的不切实际的解决办法是在窗口之间发送事件,比如qt得信号或win32的消息,但是这样会造成消息的泛滥,

JavaScript的事件_事件概述/事件模型

一.事件概述 JavaScript 事件是由访问 Web 页面的用户引起的一系列操作,例如:用户点击页面上的某个按钮或者鼠标移动到页面的某个图片上而产生一系列的互动的反馈. 当用户执行某些操作的时候,再去执行一系列代码. 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netscape Navigator 中出现,作为分担服务器端运算负载的一种手段.直到几乎所有的浏览器都支持事件处理. 而 DOM2级规范开始尝试以一种复合逻辑的方式标准化 DOM 事件.IE9.Firefox.Oper

JavaScript的事件_事件处理函数概述与鼠标事件的处理函数

一.事件处理函数概述 JavaScript 可以处理的事件类型为:鼠标事件.键盘事件.HTML 事件. 所有的事件处理函数都会都有两个部分组成,on + 事件名称,例如 click 事件的事件处理函数就是:onclick. 对于每一个事件,它都有自己的触发范围和方式,如果超出了触发范围和方式,事件处理将失效. 二.鼠标事件:页面所有元素都可触发 1.click:当用户单击鼠标按钮或按下回车键时触发. <script type="text/javascript"> windo

JavaScript的事件_键盘事件的处理函数与HTML事件的处理函数

一.键盘事件的处理函数 1.keydown:当用户按下键盘上任意键触发,如果按住不放,会重复触发. <script type="text/javascript"> window.onload = function(){ onkeydown = function () {//不需要对象调用 alert('Lee'); }; } </script> </head> <body> <input type="button"

设计模式整理_观察者模式

观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象的状态发生改变的时候,它的所有依赖者都会收到通知,并且进行更新. 被观测的对象称为主题(Subject),观察被观测的对象的对象称为观察者(Observer). 现实中的观察者模式:例如报纸的订阅.不同人(Observer)向报社(Subject)订购报纸,当报社出品了新的报纸的时候,将会通知它的订阅者,送报纸.中途订阅者可以取消订阅,此时报社就不再给他报纸.但是只要报社一直存在,就可以有人订阅报纸. 在JavaGUI中,就有观察者模式