《软件设计精要与模式》勘误

本文修正了书中关于代理模式实现的两个严重错误,并给出了正确的代码实现。一是关于Observer和Subject角色的混淆;二是代理对象中多线程处理不当,可能导致真实对象的方法被执行两次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢读者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();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值