【转发】什么时候该用委托,为什么要用委托,委托有什么好处

好多人一直在问:什么时候该用委托,为什么要用委托,委托有什么好处....

看完下面的文章你将茅塞顿开..(看不懂的直接TDDTDS)

概念虽然我不喜欢讲太多

我们直接先来YY 个场景:我很喜欢打游戏,但运气不好每次打游戏都会被主管看到,朱老板不喜欢他的员工在上班的时

间打游戏,所以朱老板就跟主管说:以后员工在打游戏,你就扣他20块钱.

这其实就是一个委托,朱老板委托主管一旦发现员工打游戏,就做一件事情.

程序该怎么写呢?

至少有2个类吧,主管与员工,主管有个方法扣钱,员工有个方法玩游戏,那么开始动工了

员工类:

public class Employee
     {
       //员工的薪水
       private int money;
       //该员工的主管
       private Manager Manager;
       public Employee(Manager manager)
       {
             // 通过构造函数,初始化员工的主管与薪水。
              Manager = manager;
              money = 8000;
       }
       public int Money
       {
          get { return money; }

          set { money = value; }
      }
      public void PlayGame()
      {
        WriteLine("员工:开始玩游戏了..");

         WriteLine("员工:CS真好玩,哈哈哈! 我玩...");

         Manager.RemoveMoney(this);
       }
     }

主管类:

public class Manager
 {
   public Manager()
    {}
    //扣薪水
    public void RemoveMoney(Employee employee)
    {
       WriteLine("主管:上班时间胆敢玩游戏");
       WriteLine("主管:看看你小子有多少薪水:" + employee.Money);
       WriteLine("主管:我开始扣薪水...");
       employee.Money -= 20;
       WriteLine("主管:扣好了.");
       WriteLine("主管:看看你小子薪水剩余:" + employee.Money);
    }
  }

MIan方法大概这么写就行了:

 public static void Main(string[] args)
  {
     // 生成主管类的对象实例 king
     Manager king = new Manager();
     // 生成员工类类的对象实例 wind
     Employee wind = new Employee(king);
     // 员工开始玩游戏
     wind.PlayGame();
  }

运行,果然结果是对的,看来做为程序员我还是比较低调的..写出来结果很正常,也不沾沾自喜..

员工:开始玩游戏了..
员工:CS真好玩,哈哈哈! 我玩...
主管:上班时间胆敢玩游戏
主管:看看你小子有多少薪水:8000
主管:我开始扣薪水...
主管:扣好了.
主管:看看你小子薪水剩余:7980

下面我们简单的分析下这个程序:

1:在创建主管类之后才能创建员工类,耦合性太高,也就是说你要创建个员工,必须要先创建个主管..

2:如果场景发生以下变化,我要让经理代替主管,我们不得不修改员工类,并增加经理类.

这样看来这段程序设计的并不好,我们不妨来考虑下事件(特殊的委托)来实现

必须要定义一个委托,就是让主管监视员工,然后员工类里要有个事件(员工也是激发该事件的对象),主管执行事件

public delegate void Play(Object Sender, System.EventArgs e);

 public class Employee
    {
        public int money = 2200;//懒得写属性了..
        public event Play play;

        public Employee()
        {

        }

        public void PlayGame()
        {
            System.EventArgs e = new EventArgs();
            OnPlayGame(this, e);
        }

        void OnPlayGame(object Sender, EventArgs e)
        {
            if (play != null)
            {
                play(Sender, e);
            }
        }
    }

主管类就要实现一个方法,这个方法与委托的返回直一样,参数一样就行了,给委托来调用的.:

 public class Manager
    {
        public Manager()
        {
        }

        public void RemoveMoney(Object Sender, System.EventArgs e)
        {
            Employee emp = Sender as Employee;
            emp.money -= 20;
            System.Diagnostics.Debug.WriteLine(emp.money);
        }
    }

那么调用就变的简单了

Manager xiaotao = new Manager();
     // 生成员工类的对象实例 shulin
     Employee shulin = new Employee();

      // 设下委托,指定监视
       shulin.play += new Play(xiaotao.RemoveMoney);

      // 员工开始玩游戏,玩一次扣一次
       e.PlayGame();
     e.PlayGame();

输出:

2180
2160

总结

当然,不使用委托和事件我们仍然可以设计出解耦的类,然而却会增加很多的类、接口以及关联等等,增加了代码量和程序的逻辑复杂性,而在.net里利用委托和事件我们只需少的多的代码来实现。

时间: 2024-08-09 14:36:59

【转发】什么时候该用委托,为什么要用委托,委托有什么好处的相关文章

C# 委托链、多路广播委托

委托链.多路广播委托:也就是把多个委托链接在一起,我们把链接了多个方法的委托称为委托链或多路广播委托 例: 1 class HelloWorld 2 { 3 //定义委托类型 4 delegate void DelegationChain(); 5 static void Main(string[] args) 6 { 7 //用静态方法来实例委托 8 DelegationChain mydelegateone=new DelegationChain(HelloWorld.Fun2); 9 //

自定义委托类型 - .Net自带委托类型

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递. 与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用. 一.自定义委托类型 1.语法结构:访问修饰符 delegate 返回类型 委托类型名称(参数列表); 例如: // 声明一个委托类型,两个参数均为int类型,返回值为int类型 public delegate int Calc(int a, int b);自定义的委托可以不带参数,也可以没有返回值. 接下来我们看一个例子怎么使用委托 1.

C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法

1.C#中的每一个委托都内置了BeginInvoke和EndInvoke方法,如果委托的方法列表里只有一个方法,那么这个方法就可以异步执行(不在当前线程里执行,另开辟一个线程执行).委托的BeginInvoke和EndInvoke方法就是为了上述目的而生的. 2.原始线程发起了一个异步线程,有如下三种执行方式: 方式一:等待一直到完成,即原始线程在发起了异步线程以及做了一些必要处理之后,原始线程就中断并等待异步线程结束再继续执行. 方式二:轮询,即原始线程定期检查发起的线程是否完成,如果没有则可

委托(一):委托与方法

一,利用委托将方法作为方法的参数 首先来看个小例子: namespace 委托示例2 { /***** * 委托示例一 * 说明:此段程序主要是将委托作为方法的参数传入方法中,使得具体调用时再根据需要为方法赋值. * * 关键点:利用委托将方法作为方法的参数 * * * * ******/ //委托的定义 //1,委托:委托出现的位置和string相同,所以GreetingDelegate应该也是个类型,但是委托的声明方式和类完全不同. //2,委托在编译的时候确实会被编译成类,因为delega

委托学习笔记1:委托的基本使用

一.引子 在正式说委托前,我先给一个例子,然后引出后面要说的委托. 很简单,就是一个机器人打招呼的. 代码清单1.1: class Robot { public void GreetByChinese(string name) { Console.WriteLine("你好," + name + "!"); } public void GreetByEnglish(string name) { Console.WriteLine("Hello,"

委托与事件一:委托初体验

委托:就是一个能存放符合某种格式(方法签名)的方法指针的容器.指针:专门用来存放内存地址的一种类型. 1.定义一个委托: namespace WindowsFormsApplication1 { //class DGSayhi //{ //} public delegate void Sayhi(); } 用反编译器打开,上述代码实际是个委托类如图: 如图所示:public delegate void Sayhi();实际是个类.类似与:( 当然,不能这么写!) public class DGS

委托实现音乐播放器 | 委托实现音乐播放器的缺点 | 事件实现音乐播放器

1,使用委托实现一个音乐播放器的功能呢.(模拟事件) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 模拟事件 { /// <summary> /// 音乐播放器类 /// </summary> public class MusicP

委托delegate 泛型委托action&lt;&gt; 返回值泛型委托Func&lt;&gt; 匿名方法 lambda表达式 的理解

1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyBookDel myBookDel; //普通方法 public static void MathBook(int a) { Console.WriteLine("我是数学书" + a); } static void Main(string[] args) { myBookDel += Ma

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

[JS]笔记14之事件委托

-->什么是事件委托-->事件委托原理-->事件委托优点-->事件源 / 目标源 一.什么是事件委托 通俗的讲,onclick,onmouseover,onmouseout等这些就是事件 委托,就是这个事件本来应该加在某些元素上的,而你却加到其他元素上来完成这个事件. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &