委托系列03-委托的作用与意义

一、需求模拟

分别有武汉人、上海人、广东人,三种不同城市的学生,问候的口语不一样,模拟见面打招呼。

二、代码准备

    /// <summary>
    /// 学生类
    /// </summary>
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int ClassId { get; set; }
        public int Age { get; set; }
    }

三、常用方式

1、通过枚举,定义不同的城市学员

    public enum UserType
    {
        Wuhan = 1,
        Shanghai = 2,
        GuangDong = 3,
        BeiJing = 4
    }

打招呼:

        /// <summary>
        /// 问好
        /// </summary>
        public void SayHi(UserType type)
        {
            Console.WriteLine("问候前。。。招招手。。。");
            switch (type)
            {
                case UserType.Wuhan:
                    Console.WriteLine("吃了么?过早了吗?");
                    break;
                case UserType.Shanghai:
                    Console.WriteLine("侬好!");
                    break;
                case UserType.GuangDong:
                    Console.WriteLine("雷猴!");
                    break;
                default:
                    throw new Exception("NO UserType"); //不掩盖错误

            }
            Console.WriteLine("你好!");
        }

调用:

                    Student student = new Student()
                    {
                        Id = 1234,
                        Name = "慎独",
                        Age = 25,
                        ClassId = 1
                    };

                    student.SayHi(UserType.Wuhan);
                    student.SayHi(UserType.Shanghai);
                    student.SayHi(UserType.GuangDong);

2、每个城市的学员创建一个打招呼的方法

        /// <summary>
        /// 武汉人打招呼
        /// </summary>
        public void SayHiWuhHan()
        {
            Console.WriteLine("吃了么?过早了吗?");
        }

        /// <summary>
        /// 上海人打招呼
        /// </summary>
        public void SayHiShangHai()
        {
            Console.WriteLine("侬好!");
        }

        /// <summary>
        /// 广东人打招呼
        /// </summary>
        public void SayHiGuangDong()
        {
            Console.WriteLine("雷猴!");
        }

调用:

                    Student student = new Student()
                    {
                        Id = 1234,
                        Name = "慎独",
                        Age = 25,
                        ClassId = 1
                    };

                    student.SayHiWuhHan();
                    student.SayHiShangHai();
                    student.SayHiGuangDong();

四、常用方式存在的问题

1、新增需求

  • 1、来了一个北京人,北京人打招呼的当时和上面3个城市的都一样。
  • 2、每个打招呼前都要加一个一样的语句。

2、枚举方式的解决方案

a、修改枚举

委托系列03-委托的作用与意义

b、修改打招呼的方法,增加一个条件判断

委托系列03-委托的作用与意义

注意:修改此方法存在风险,函数发生了改变,可能会引起其他的逻辑,需要重复测试

c、新增一个打招呼前的语句

委托系列03-委托的作用与意义

3、非枚举方式的解决方案

a、新增一个北京人打招呼的方法

委托系列03-委托的作用与意义

b、在每个打招呼方法前新增一个打招呼前的语句

委托系列03-委托的作用与意义

4、优缺点

a、枚举方式

优点:新增通用语句方便,只需要在函数前面新增即可。
缺点:新增一种打招呼方式就需要修改枚举类型和打招呼的函数逻辑,带来风险。

b、非枚举方式

优点:每个城市的打招呼方法相对独立,互不干扰。
缺点:新增通用语句麻烦,需要在每个打招呼的函数前面新增。

四、委托

以上这两种都有不完美的地方----有没有既可以没有那么多的重复代码,也相对稳定的方案呢?--有
SayHiPerfect---
传递枚举的时候:目的是为了选择不同的业务逻辑:既然最终都是要选择业务逻辑的;--就可以传递逻辑呗;逻辑是什么--逻辑其实就行为---行为就是方法---方法的传递;就需要把方法当做参数一样传递过来;--委托在实例化的时候,委托就要一个方法;就可以传递一个委托,把方法放在委托中传递过来;

1、使用

a、新增一个委托

public delegate void SayHiDalegate();

b、新增一个方法,参数为每个打招呼的方法

        /// <summary>
        /// 既没有重复代码-0-也相对稳定的方法---完美方法;
        /// </summary>
        public void SayHiperfect(SayHiDalegate sayHiDalegate)
        {
            Console.WriteLine("问候前,招招手。。。");
            sayHiDalegate.Invoke();
        }

c、调用

                        SayHiDalegate sayHiDalegate = new SayHiDalegate(student.SayHiWuhHan);
                        student.SayHiperfect(sayHiDalegate);

                        SayHiDalegate sayHiDalegate1 = new SayHiDalegate(student.SayHiShangHai);
                        student.SayHiperfect(sayHiDalegate1);

                        SayHiDalegate sayHiDalegate2 = new SayHiDalegate(student.SayHiGuangDong);
                        student.SayHiperfect(sayHiDalegate2);

                        SayHiDalegate sayHiDalegate3 = new SayHiDalegate(student.SayHiBeijing);
                        student.SayHiperfect(sayHiDalegate2);

2、特点

即使新增了一种新的打招呼方式,只需要新增一个方法即可,既不会影响其他打招呼的方法代码逻辑,也实现了扩展。

五、总结

委托系列03-委托的作用与意义

上一篇:Ctrl + 鼠标左键查看jar包源代码


下一篇:聊聊React类组件中的setState()的同步异步(附面试题)