《软件设计精要与模式》勘误
感谢读者Calix.Chen对本书的仔细阅读,给我指出了书中的几个错误。
1、在本书第20章278页的20.2节第5行:“Observer抽象为包含ChangeState方法的接口”,改为“将Subject抽象为包含ChangeState方法的接口”。
2、在本书第21章所给出的示例中,犯了两个严重的错误:
(1)不应该在代理对象ProxyControlsCreator的构造函数中多线程运行真实对象RealControlsCreator的CreateEQPControls方法,而应该在代理对象ProxyControlsCreator的CreateEQPControls方法中多线程运行;
(2)按照原书给出的代码,由于真实对象的CreateEQPControls方法是在代理对象的构造函数中执行,则可能导致在执行代理对象的CreateEQPControls方法执行之前,真实对象的CreateEQPControls方法已经执行完毕,从而可能导致该方法会被执行两次(客户端显式调用一次,AddControlsEvent事件触发时调用一次)
鉴于以上两个错误,需要修改代理对象ProxyControlsCreator的实现,代码如下:
namespace DonOfDesign.PracticeProxy.ControlsShow
{
public class ProxyControlsCreator : ControlsCreator
{
private RealControlsCreator m_realCreator = new RealControlsCreator();
private Thread m_thread;
//定义事件;
public event AddControlsHandler AddControlsEvent;
public ProxyControlsCreator()
{
//将CreateEQPControls方法与真实对象的事件建立委托链
m_realCreator.AddControlsEvent += new AddControlsHandler(CreateEQPControls);
}
public override void CreateEQPControls()
{
if (m_realCreator.BeCompleted)
{
m_controls = new Control[m_realCreator.Controls.Length];
m_realCreator.Controls.CopyTo(m_controls, 0);
//当代理对象的控件集合被更新后,需要触发事件通知OperatorForm
if (AddControlsEvent != null)
{
AddControlsEvent();
}
if (m_thread != null)
{
m_thread.Abort();
}
}
else
{
//在后台运行真实对象的业务逻辑;
m_thread = new Thread(new ThreadStart(m_realCreator.CreateEQPControls));
m_thread.Start();
//在前台运行代理对象的业务逻辑;
base.CreateEQPControls();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
2004-11-29 《让僵冷的翅膀飞起来》系列之一——从实例谈OOP、工厂模式和重构