zoukankan      html  css  js  c++  java
  • [转]什么时候该用委托,为什么要用委托,委托有什么好处

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

    看完下面的文章你将茅塞顿开..(看不懂的直接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()
             {
                 System.Diagnostics.Debug.WriteLine("员工:开始玩游戏了..");

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

                 Manager.RemoveMoney(this);
             }

         }

    主管类:

         public class Manager
        {

            public Manager()
            {

            }
            //扣薪水
            public void RemoveMoney(Employee employee)
            {
                System.Diagnostics.Debug.WriteLine("主管:上班时间胆敢玩游戏");

                System.Diagnostics.Debug.WriteLine("主管:看看你小子有多少薪水:" + employee.Money);

                System.Diagnostics.Debug.WriteLine("主管:我开始扣薪水...");

                employee.Money -= 20;

                System.Diagnostics.Debug.WriteLine("主管:扣好了.");

                System.Diagnostics.Debug.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里利用委托和事件我们只需少的多的代码来实现。

  • 相关阅读:
    Codeforces Round #632 (Div. 2) D-Challenges in school №41(模拟好题)
    余数求和
    B. 齐心抗疫
    MyBatis源码分析
    关于Idea中右边的maven projects窗口找不到了如何调出来
    IDEA java类文件左下角出现红色的J标识,解决方法
    Postman Tests脚本的使用
    JSONPath解析json
    Postman + Newman 生成测试报告
    TestNG 多线程测试
  • 原文地址:https://www.cnblogs.com/NoRoad/p/2795865.html
Copyright © 2011-2022 走看看