委托的注册及注销+观察者模式

事件

委托变量如果公开出去,很不安全,外部可以随意调用

所以取消public,封闭它,我们可以自己书写两个方法,供外部注册与注销,委托调用在子方法里调用,这样封装委托变量可以使它更安全,这个就叫做事件

1.外部不能随便调用,只能注册和注销

2.只能自己去调用自己的委托

委托练习题:

老师会在下课时打铃(事件)

学生们想在打铃事件发生的时候做自己的事情:

小明想在打铃的时候去买东西吃,

小张想在打铃时去打水,

小红想在打铃时开始练习,

小花想在打铃时去打羽毛球。

代码如下:

cs 复制代码
using System;

namespace 事件
{
    public delegate void CallDelegate();
    class Teacher
    {
        public string name;
        CallDelegate callDel;

        public void RegisterCallEvent(CallDelegate del)
        {
            callDel += del;
        }
        public void LogoutCallEvent(CallDelegate del)
        {
            callDel -= del;
        }
        public Teacher(string name)
        {
            this.name = name;
        }
        public void Call()
        {
            Console.WriteLine("{0}打铃了!",name);
            if (callDel != null)
            {
                callDel();
            }

        }

    }
    class Student
    {
        public string name;
        public string action;
        public Student(string name, string action)
        {
            this.name = name;
            this.action = action;
        }
        public void DoThing()
        {
            Console.WriteLine(name + action);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Teacher teacher = new Teacher("王老师");
            Student xiaoming = new Student("小明", "买东西吃");
            Student xiaozhang = new Student("小张", "打水");
            Student xiaohong = new Student("小红", "练习");
            Student xiaohua = new Student("小花", "打羽毛球");

            //teacher.callDel = xiaoming.DoThing;
            //teacher.callDel += xiaozhang.DoThing;
            //teacher.callDel += xiaohong.DoThing;
            //teacher.callDel += xiaohua.DoThing;

            //teacher.Call();
            teacher.RegisterCallEvent(xiaoming.DoThing);
            teacher.RegisterCallEvent(xiaozhang.DoThing);
            teacher.RegisterCallEvent(xiaohong.DoThing);
            teacher.RegisterCallEvent(xiaohua.DoThing);

            teacher.Call();
        }
    }
    
}
观察者模式

模型------视图

发布------订阅

源------收听者

一系列对象来监听另外一个对象的行为,被监听者一旦触发事件/发布消息,则被所有监听者收到,然后执行自己的行为。

就是使用委托/事件,让一系列对象把他们的行为来注册到我的委托中去。

该系列专栏为网课课程笔记,仅用于学习参考。

相关推荐
L_autinue_Star1 小时前
手写vector容器:C++模板实战指南(从0到1掌握泛型编程)
java·c语言·开发语言·c++·学习·stl
元气小嘉2 小时前
前端技术小结
开发语言·前端·javascript·vue.js·人工智能
励志的大鹰哥2 小时前
V少JS基础班之第七弹
开发语言·javascript·ecmascript
AI360labs_atyun2 小时前
Java在AI时代的演进与应用:一个务实的视角
java·开发语言·人工智能·科技·学习·ai
凤年徐3 小时前
【数据结构与算法】203.移除链表元素(LeetCode)图文详解
c语言·开发语言·数据结构·算法·leetcode·链表·刷题
nbsaas-boot3 小时前
多租户架构下的多线程处理实践指南
java·开发语言·spring
无小道3 小时前
c++--typedef和#define的用法及区别
c语言·开发语言·汇编·c++
SoniaChen334 小时前
Rust基础-part2-变量和可变类型
开发语言·后端·rust
钢铁男儿4 小时前
C#接口实现详解:从理论到实践,掌握面向对象编程的核心技巧
java·前端·c#
神所夸赞的夏天5 小时前
c#获取Datatable中某列最大或最小的行数据方法
开发语言·c#