委託的好處

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             }    

該種方式的優缺點

將邏輯作為參數傳遞,既增加公共邏輯方便,又邏輯分離維護簡單,魚肉熊掌兼得。自上往下,邏輯解耦,方便維護升級;自下往上,代碼重用,去掉重複代碼

相同的東西用一個方法實現,不同的各自去寫,然後通過委託組合,加方法滿足不同的場景,如果方法特別複雜,就推薦這個。

Tags: