委托的好处
Posted netlws
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托的好处相关的知识,希望对你有一定的参考价值。
1、业务背景
技术为业务而生,我们探讨某一个技术带来的价值时,都需要有一定的业务背景作为前提。
我们先来看如下需求背景:
定义一个学生类,属性包含学生姓名、学号、年龄、创建时间,行为包含学生可以使用正确的方式对不同国家的人打招呼,如对中国人打招呼为:张三,你好!对美国人打招呼为Jack hello!
2、解决方式1
示例代码及调用方式
1 public class Student 2 { 4 public enum PeopleType 5 { 6 Chinese = 1, 7 American = 2 8 } 9 10 public string StuName { get; set; } 11 12 public string StuNum { get; set; } 13 14 public int Age { get; set; } 15 16 public DateTime CreateTime { get; set; } 17 18 /// <summary> 19 /// 对不同国家的人说hello,每个国家的表达方式不一样 20 /// </summary> 21 /// <param name="name"></param> 22 /// <param name="peopleType"></param> 23 public void SayHello(string name, PeopleType peopleType) { 24 25 Console.WriteLine($"{this.StuName }开始打招呼"); 26 27 switch (peopleType) 28 { 29 case PeopleType.Chinese: 30 Console.WriteLine($"{name},你好!"); 31 break; 32 case PeopleType.American: 33 Console.WriteLine($"{name},hello"); 34 break; 35 default: 36 throw new Exception("enum PeopleType exception"); 37 } 38 } 39 }
1 { 2 Student student = new Student() { 3 StuName = "wjl", 4 StuNum = "14216600010", 5 Age = 18, 6 CreateTime = DateTime.Now 7 }; 8 student.SayHello("张三", PeopleType.Chinese); 9 student.SayHello("jack", PeopleType.American); 10 }
该种方式的优缺点
假如要增加一个类型的国家马来西亚,就得修改方法,增加一个分支,任意分支变化 都得修改方法,经常改动,很不稳定,难以维护。
但这种方式增加公共逻辑方便,如:Console.WriteLine($"{this.StuName }开始打招呼");
3、解决方式2
示例代码及调用方式
1 public class Student 2 { 4 public enum PeopleType 5 { 6 Chinese = 1, 7 American = 2 8 } 9 10 public string StuName { get; set; } 11 12 public string StuNum { get; set; } 13 14 public int Age { get; set; } 15 16 public DateTime CreateTime { get; set; } 17 18 /// <summary> 19 /// 对中国人说你好 20 /// </summary> 21 /// <param name="name"></param> 22 public void SayHelloChinese(string name) 23 { 24 Console.WriteLine($"{this.StuName }开始打招呼"); 25 Console.WriteLine($"{name},你好!"); 26 } 27 28 /// <summary> 29 /// 对美国人说你好 30 /// </summary> 31 /// <param name="name"></param> 32 public void SayHelloAmerican(string name) 33 { 34 Console.WriteLine($"{this.StuName }开始打招呼"); 35 Console.WriteLine($"{name},hello"); 36 } 37 }
1 { 2 Console.WriteLine("调用说你好的功能,方式2"); 3 Student student = new Student() 4 { 5 StuName = "wjl", 6 StuNum = "14216600010", 7 Age = 18, 8 CreateTime = DateTime.Now 9 }; 10 student.SayHelloChinese("张三"); 11 student.SayHelloAmerican("jack"); 12 }
该种方式的优缺点
增加分支(如对马来西亚人打招呼),就要增加方法,不影响别的方法,修改某个方法,不影响别的方法,增加公共逻辑会导致多个方法有很多重复代码,不利于代码复用,甚至如果要修改这些公共逻辑,需要修改的地方较多,不利于维护。
4、解决方式3
示例代码及调用方式
1 public class Student 2 { 3 public delegate void SayHelloDelegate(string name); 4 5 public enum PeopleType 6 { 7 Chinese = 1, 8 American = 2 9 } 10 11 public string StuName { get; set; } 12 13 public string StuNum { get; set; } 14 15 public int Age { get; set; } 16 17 public DateTime CreateTime { get; set; } 18 19 public void SayHelloPerfect(string name, SayHelloDelegate sayHello ) { 20 21 Console.WriteLine($"{this.StuName }开始打招呼"); 22 sayHello.Invoke(name); 23 } 24 }
1 { 2 Student student = new Student() 3 { 4 StuName = "wjl", 5 StuNum = "14216600010", 6 Age = 18, 7 CreateTime = DateTime.Now 8 }; 9 SayHelloDelegate method1 = student.SayHelloChinese; 10 student.SayHelloPerfect("张三", method1); 13 SayHelloDelegate method2 = student.SayHelloAmerican; 14 student.SayHelloPerfect("Jack", method2); 15 }
该种方式的优缺点
将逻辑作为参数传递,既增加公共逻辑方便,又逻辑分离维护简单,鱼肉熊掌兼得。自上往下,逻辑解耦,方便维护升级;自下往上,代码重用,去掉重复代码
相同的东西用一个方法实现,不同的各自去写,然后通过委托组合,加方法满足不同的场景,如果方法特别复杂,就推荐这个。
以上是关于委托的好处的主要内容,如果未能解决你的问题,请参考以下文章