大家好,欢迎来到IT知识分享网。
使用委托的最终目的:可以向某个代码内部嵌入一段外部代码,相当于代码”注入”,用于实现各自想要的结果
示例1:两个控制台项目,需要使用同一类库框架的查询功能,假设此框架是最流行且安全方便高效的查询数据框架,但是每个项目查询数据后的处理方式各不相同,框架内部实现代码肯定不会公开,因此会给外部提供一个可以嵌入一段代码,实现自己处理数据的接口,此接口就可以使用委托实现(无参数无返回值)
两个控制台项目的处理方式:1)将数据写入文本文件保存 2)将数据插入数据库保存
//框架的 查询功能 方法 public void QueryDate() { Console.WriteLine("当前非常牛叉的数据查询框架"); //==代表框架中的其他相关代码 Console.WriteLine("======================="); Console.WriteLine("======================="); Console.WriteLine("======================="); //此处是用于嵌入代码的地方 Console.WriteLine("======================="); Console.WriteLine("======================="); Console.WriteLine("======================="); }
ClassLibrary1 是类库项目,其他两个控制台项目需要引用此类库项目,才能使用其内部的查询功能方法
实现步骤:
1)在类库中新建一个类,在类中定义一个无参数无返回值的委托类型(两个项目中的实现方法需符合此委托类型的签名)
2)在类库的Class1类中实现方式
方式1:将声明的委托变量作为QueryDate()方法的参数传入
方式2:将声明的委托变量,直接写入查询方法嵌入代码的地方
相当于为QueryDate()编写了一个重载方法,最后调用”变量”
3)在各自控制台项目中编写实现目标的方法(示例中使用静态方法)
//步骤1 using System; namespace ClassLibrary1 { //定义无参数无返回值的委托类型 public delegate void HandleDateDelegate (); }
//步骤2 using System; namespace ClassLibrary1 { public class Class1 { public HandleDateDelegate HandleDate; //方式1 当做参数传入 public void QueryDate(HandleDateDelegate HandleDate) { Console.WriteLine("当前非常牛叉的数据查询框架"); //==代表框架中的其他相关代码 Console.WriteLine("======================="); Console.WriteLine("======================="); Console.WriteLine("======================="); //此处是用于嵌入代码的地方 //调用此委托变量 //相当于调用传入的外界实现方法 HandleDate(); Console.WriteLine("======================="); Console.WriteLine("======================="); Console.WriteLine("======================="); } //方式2 //内部先判断后调用 public void QueryDate() { Console.WriteLine("当前非常牛叉的数据查询框架"); //==代表框架中的其他相关代码 Console.WriteLine("======================="); Console.WriteLine("======================="); Console.WriteLine("======================="); //此处是用于嵌入代码的地方 //调用之前判断外界是否为变量 HandleDate 赋值 //外界为其赋值 才可调用 if (HandleDate != null) { //此方式没有判断直接调用 //抛异常:未将对象引用设置到对象的实例 HandleDate(); } Console.WriteLine("======================="); Console.WriteLine("======================="); Console.WriteLine("======================="); } } }
控制台项目1,项目2实现代码
class Program { static void Main(string[] args) { Class1 c1 = new Class1(); //方式1 c1.QueryDate(M1); Console.WriteLine(""); //方式2 //c1.HandleDate = M2; c1.QueryDate(); Console.ReadKey(); } //项目1 写入文本文件 //项目2 传入数据库 //两者只有输出文本不同,其他基本一样 static void M1() { Console.WriteLine("方式1:数据写入文本文件中"); } static void M2() { Console.WriteLine("方式2:数据写入文本文件中"); } }
示例2:循环修改字符串数组中字符显示样式(假设全部大写,小写,两侧加★ 等等显示样式)
public class Class2 { //旧的实现方式 public void ChangeStr(string[] strs) { for (int i = 0; i < strs.Length; i++) { strs[i] = strs[i].ToUpper(); } } //需要编写不同的方法进行实现 //使用委托方式:将需要改变的地方 //使用委托变量代替 //新方式 public void ChangeStr(string[] strs) { for (int i = 0; i < strs.Length; i++) { //不再由内部的方法具体实现 //而是由 委托变量 ChgStr 代替 //由外界方法中的代码实现 strs[i] =ChgStr(strs[i]); //此委托变量的类型应该是 //有参数 strs[i] 字符串类似 有返回值 字符串类型 } } }
实现步骤:
1) 定义一个有参数有返回值的委托类型
2) 修改原方法ChangeStr()
3) 在外部项目3中指定具体实现的方法
//步骤1 使用原类库 //定义 字符串修改的委托类型 using System; namespace ClassLibrary1 { //定义无参数无返回值的委托类型 public delegate void HandleDateDelegate(); //定义修改字符串样式的委托类型 public delegate string ChangeString(string str); }
在Class2类型修改原方法ChangeStr()
//步骤2 public class Class2 { //public void ChangeStr(string[] strs) //{ // for (int i = 0; i < strs.Length; i++) // { // strs[i] = strs[i].ToUpper(); // } //} //ChangeStr方法修改为有两个参数, ChangeString 委托类型 public void ChangeStr(string[] strs, ChangeString ChgStr) { for (int i = 0; i < strs.Length; i++) { //具体实现由外界的方法决定 strs[i] = ChgStr(strs[i]); } } }
在控制台项目3中编写具体实现代码(添加对类库的引用)
//步骤3 using System; using ClassLibrary1; namespace 项目3 { class Program { static void Main(string[] args) { string[] strs = { "BeiJing", "MenTouGou", "JiuZai" }; Class2 c2 = new Class2(); //调用c2的修改方法 //传入修改为大写的方法 c2.ChangeStr(strs, StrToUpper); for (int i = 0; i < strs.Length; i++) { Console.Write(" {0} ", strs[i]); } Console.WriteLine(""); //传入修改为小写的方法 c2.ChangeStr(strs, StrToLower); for (int i = 0; i < strs.Length; i++) { Console.Write(" {0} ", strs[i]); } Console.WriteLine(""); //传入修改为加★的方法 c2.ChangeStr(strs, StrWJX); for (int i = 0; i < strs.Length; i++) { Console.Write(" {0} ", strs[i]); } Console.WriteLine(""); Console.ReadKey(); } //大写 static string StrToUpper(string str) { return str.ToUpper(); } //小写 static string StrToLower(string str) { return str.ToLower(); } //五角星 static string StrWJX(string str) { return str="★"+str+"☆"; } } }
使用委托的益处:
1)无需修改源代码即保护了内部代码实现又实现了编程的”开放封闭原则”
2)便于扩展应用灵活,最终实现由使用者自己编写的代码实现
开放封闭原则:面向对象编程原则的核心即软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/108203.html