zoukankan      html  css  js  c++  java
  • 通俗易懂大白话之C#委托与事件实例

    有关委托和事件的文章已经有很多, 之前看过一篇讲的实例比较形象, 因此借鉴并加以改进一下, 希望能够帮助还没有过这道坎的同学;

    借鉴文章: https://www.cnblogs.com/yinqixin/p/5056307.html

    本文没有任何概念介绍,旨在帮助同学们快速用上委托和事件,越过这道坎。

    应用场景举例:    

    刘备设鸿门宴, 吩咐关羽和张飞各自带队埋伏在门外,  刘备摔杯为号, 关羽和张飞则带队杀出;

    关羽和张飞杀出的具体过程, 他们自己实现即可.

    但刘备会不会摔杯, 什么时候摔杯 刘备自己也不知道..得看情况..

    所以当然不能用传统方式, 在刘备摔杯的方法里面调用关羽和张飞的杀出方法,

    如果刘备(BOSS)临时变卦, 要多安排赵云,马超,黄忠等等众多将领在门外呢?

    那刘备的摔杯方法岂不是要调用所有将领的杀出方法?

    这样写代码要传递众多将领对象, 刘备的摔杯方法会进行无尽的修改和完善,显然不是我们所希望的。

    使用委托和事件的实现方式:

    首先定义刘备,关羽,张飞3个类:

    刘备有摔杯的委托和事件, 以及摔杯方法;

    关羽和张飞则有杀出方法;

    public class 刘备
        {
            public delegate bool 摔杯委托(string str);
            public event 摔杯委托 摔杯事件;
    
            public void 摔杯方法()
            {
                if (摔杯事件 != null)
                    摔杯事件("猛猛的摔杯 (只是示例个参数)");
            }
        }
    
        public class 关羽
        {
            public bool 杀出(string str)
            {
                Console.WriteLine("关羽带300刀斧手从北门杀出!");
                return true;
            }
        }
    
        public class 张飞
        {
            public bool 杀出(string str)
            {
                Console.WriteLine("张飞带300刀斧手从南门杀出!");
                return true;
            }
        }
    View Code

    那么为了方便大家理解注册事件,  也就是关羽和张飞接受刘备的摔杯为号的约定, 我们先这样写:

    static class Program
        {
            static void Main()
            {
                刘备 lb = new 刘备();
                关羽 gy = new 关羽(lb);
                张飞 zf = new 张飞(lb);
                //分别注册事件
                lb.摔杯事件 += gy.杀出;
                lb.摔杯事件 += zf.杀出;
                //刘备摔杯
                lb.摔杯方法();
            }
        }
    View Code

    最终完整代码如下:

    (下面代码注册事件改为在对象内部实现)

    using System;
    
    namespace Test
    {
        static class Program
        {
            static void Main()
            {
                刘备 lb = new 刘备();
                关羽 gy = new 关羽(lb); //可以理解为, 刘备与关羽约定好摔杯杀出, 然后关羽自己注册事件
                张飞 zf = new 张飞(lb); //同上
                //刘备摔杯
                lb.摔杯方法();
            }
        }
    
        public class 刘备
        {
            public delegate bool 摔杯委托(string str);
            public event 摔杯委托 摔杯事件;
    
            public void 摔杯方法()
            {
                if (摔杯事件 != null)
                    摔杯事件("猛猛的摔杯 (只是示例个参数)");
            }
        }
    
        public class 关羽
        {
            public 关羽(刘备 lb)
            {
                lb.摔杯事件 += 杀出;
            }
    
            public bool 杀出(string str)
            {
                Console.WriteLine("关羽带300刀斧手从北门杀出!");
                return true;
            }
        }
    
        public class 张飞
        {
            public 张飞(刘备 lb)
            {
                lb.摔杯事件 += 杀出;
            }
    
            public bool 杀出(string str)
            {
                Console.WriteLine("张飞带300刀斧手从南门杀出!");
                return true;
            }
        }
    }
    View Code

    大家再想一想, 如果还有赵云,马超,黄忠等等更多将领呢?

    程序拓展也非常方便, 定义好新将领的类并实现杀出方法即可, 和关羽张飞代码类似;

    使用设计模式的话,  可以建立一个将领的父类, 实现基本的杀出方法. 如果个别将领有特别的杀出方法, 重写杀出方法即可.

    如果有不对的地方欢迎指出 

  • 相关阅读:
    golang 内存模型
    go-设计思想
    扁平化团队的实质
    技术团队的管理体系
    技术团队的目标管理
    从0到1打造直播 App
    管理你的项目
    JavaEE开发基础
    Java调优知识汇总
    从技术走向管理读书笔记
  • 原文地址:https://www.cnblogs.com/Mex13/p/8027438.html
Copyright © 2011-2022 走看看