当前位置: 首页 > news >正文

开始委托之旅 委托与接口

好了,下面让我从一个示例开始,一步一步引入委托的概念。

从示例开始

假设一个系统的用户登录模块有如下所示的代码

class User { public string Name { get; set; } public string Password { get; set; } } class UserService { public void Register(User user) { if (user.Name == "Kirin") { Log("注册失败,已经包含名为" + user.Name + "的用户"); } else { Log("注册成功!"); } } privte void Log(string message) { Console.WriteLine(message); } }

UserService类封装用户登录的逻辑,并根据不同的登录情况向控制台打印不同的日志内容。当程序关闭时,所记录的日志自然也随之消失。

客户端的代码为

class Program { static void Main(string[] args) { User user = new User { Name = "Kirin", Password = "123" }; UserService service = new UserService(); service.Register(user); Console.ReadLine(); } }

使用策略模式

然而这样的设计肯定是无法满足用户的需求的,用户肯定希望能够查看以前的日志记录,而不仅仅是程序打开以后的内容。如果我们仅仅修改Log方法的实现,那么用户需求再次改变时我们该如何处理呢?难道要无休止地修改Log方法吗?

既然日志记录的方式是变化的根源,我们自然会想到将其进行封装。我们创建一个名为ILog的接口。

interface ILog { void Log(string message); }

并创建两个实现了ILog的类,ConsoleLog和TextLog,分别用来向控制台和文本文件输出日志内容。

class ConsoleLog : ILog { public void Log(string message) { Console.WriteLine(message); } }
class TextLog : ILog { public void Log(string message) { using (StreamWriter sw = File.AppendText("log.txt")) { sw.WriteLine(message); sw.Flush(); sw.Close(); } } }

在UserService类中添加一个ILog类型的属性LogStrategy。

class UserService { public ILog LogStrategy { get; set; } public UserService() { LogStrategy = new ConsoleLog(); } public void Register(User user) { if (user.Name == "Kirin") { LogStrategy.Log("注册失败,已经包含名为" + user.Name + "的用户"); } else { LogStrategy.Log("注册成功!"); } } }

客户端代码变为如下形式。

class Program { static void Main(string[] args) { User user = new User { Name = "Kirin", Password = "123" }; UserService service = new UserService { LogStrategy = new TextLog() }; service.Register(user); Console.ReadLine(); } }

在声明UserService的时候,还可以将将LogStrategy设置为TextLog。这样在UserService进行逻辑处理时,使用的LogStrategy即为TextLog,日志将输出到文本文件中。

我们在干什么?我们在重构。重构的结果是什么?重构的结果是实现了一个简单的策略模式。

使用委托

然而策略模式仍然不能满足客户的需求,这是为什么呢?

1.用户也许会希望自定义Log的实现。当然,你可以通过在客户代码处扩展ILog来实现自己的日志记录方式。如

class TextBoxLog : ILog { private TextBox textBox; public TextBoxLog(TextBox textBox) { this.textBox = textBox; this.textBox.Multiline = true; } public void Log(string message) { textBox.AppendText(message); textBox.AppendText(Environment.NewLine); } }
http://www.jsqmd.com/news/1132148/

相关文章:

  • 张掖口碑黄金铂金回收白银回收实体老店
  • 大模型提示词工程分类
  • 加捻织唛与不加捻织标区别及织唛商标行业3大互联网推广方式
  • 高效制作专业幻灯片的完全指南:Marp for VS Code实用教程
  • AI时代,企业核心业务中台化建设思考
  • AI编程实战:从RAG系统构建看大模型应用开发的核心逻辑
  • AI基础概念入门----prompt
  • 卡梅德生物技术快报| KM13 辅助噬菌体的天然 VHH 噬菌体文库全套构建流程与数据验证
  • 2026年7月5日 AI行业最新资讯
  • AutoUnipus终极指南:三步实现U校园全自动答题,学习效率提升500%
  • 模型可解释性:特征重要性/SHAP/LIME
  • javascript的鼠标事件是个比较庞大的家族。常见的有以下8个:
  • 数据库第六章
  • Agent时代的知识图谱,到底还能怎么玩?
  • Product Hunt 每日热榜 | 2026-07-04
  • Web 渗透测试中的注入漏洞:从原理到实战的完整攻防指南
  • 作业也也也也耶耶耶耶耶
  • P1028 [NOIP 2001 普及组] 数的计算
  • MP1584 降压电源 PCB 布局 5 大要点:实测 SW 节点尖峰降低 60%
  • Pandas基础:数据分析瑞士军刀
  • 《智人之上》第四章「错误:绝对正确是一种幻想 」读后总结
  • 张家口口碑黄金铂金回收白银回收实体老店
  • 《智人之上》第三章「文件:纸老虎也会咬人 」读后总结
  • NSK精密滚珠丝杠W1602MA技术详解
  • GPU打满却吞吐不涨?SGLang用Tracing+AI Agent揪出推理“黑盒”卡点
  • 我节选一些我喜欢的片段和大家分享一下,开复老师有关教育、做人、团队建设、领导能力等方面的论述以及他自己的行动太让我惊喜了!
  • ROS2/Gazebo 仿真:机器人 URDF 中惯性张量参数 4 步校准与实测验证
  • 高效同步降压转换器与PIC18F47K42的硬件设计及I2C控制
  • 来自技术新人的一个自我介绍
  • 华为设备Bootloader解锁终极指南:使用PotatoNV实现系统定制自由