观察者模式使用心得

观察者模式作为GOF 24个常见设计模式之一,在实际编程中应用非常广泛,该设计模式的基本内容,可以参照http://blog.csdn.net/alicehyxx/archive/2009/07/31/4397114.aspx.

最近在使用观察者模式的过程中,遇到两个非常棘手的问题:

1、    对于目标的更新,导致观察者多次更新的问题。

2、    若目标为指针,观察者Attach()目标后,目标指针被删除,导致观察者与目标Detach()时,软件死机的问题。

一、              观察者多次更新

对于观察者多次更新的问题,可以选择手动调用目标的Notify()函数。但多数情况下,手动调用函数不能满足需求。我们可以给目标增加一个时间戳,当目标修改后,设置时间戳为更新时间点;而后利用OnIdle()函数,检查所有目标的时间戳,并通知观察者更新,大致代码如下:

static ULONGLONG ull = 0;

if(Notify(ull))

{

       ull = GetTimeStamp();

}

Notify()函数中,判断目标时间戳是否大于ull值,若大于,则通知观察者更新,更新后设置目标时间戳为ull;若小于,则直接返回。更新后,保存时间戳,防止目标未更新,再次通知观察者更新。

二、              目标指针被删除

对于目标指针被删除的问题,可以采用引用计数的方法解决。目标指针不能直接delete,而通过引用计数技术删除。

目标重载Wsubject()Attach()函数和Detach()函数,大致代码如下:

class Qsubject : public Wsubject

{

Public:

       void ref()

{

       ++ m_iref;

}

       void unref()

{

n     m_iref;

n     if(m_iref == 0)

delete this;

}

      

       virtual void Attach(Wobserver* pObserver)

{

              Wsubject::Attach(pObserver);

              ref();

}

       virtual void Detach(Wobserver* pObserver)

{

              Wsubject:: Detach (pObserver);

              unref();

}

private:

       int m_iref;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值