快速业务通道

设计模式之观察者(Observer)模式与其C++通用实现(下)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
e
14. observers_.push_back(&observer);
15. unlock();
16. }
17.
18. void removeObserver(ObserverT &observer) {
19. lock();
20. if (withinLoop_)
21. modifyActionBuf_.insert(std::make_pair(false, &observer));
22. else
23. observers_.erase(
24. remove(observers_.begin(), observers_.end(), &observer),
25. observers_.end());
26. unlock();
27. }
28.
29.protected:
30. template <typename ReturnT>
31. void notifyAll(ReturnT (ObserverT::*pfn)()) {
32. beginLoop();
33. for (ContainerT::iterator it = observers_.begin(), itEnd = observers_.end(); it != itEnd; ++it)
34. ((*it)->*pfn)();
35. endLoop();
36. }
37. ...
38.private:
39. inline void beginLoop() {
40. lock();
41. withinLoop_ = true;
42. unlock();
43.
44. }
45.
46. void endLoop() {
47. lock();
48. if (!modifyActionBuf_.empty()) {
49. for (std::multimap<bool, ObserverT*>::iterator it = modifyActionBuf_.begin(),
50. itEnd = modifyActionBuf_.end(); it != itEnd; ++it) {
51. if (it->first)
52. observers_.push_back(it->second);
53. else
54. observers_.erase(
55. remove(observers_.begin(), observers_.end(), it->second),
56. observers_.end());
57. }
58. modifyActionBuf_.clear();
59. }
60. withinLoop_ = false;
61. unlock();
62. }
63.
64.protected:
65. ContainerT observers_;
66.
67.private:
68. bool withinLoop_;
69. std::multimap<bool, ObserverT*> modifyActionBuf_;
70.};

我使用了STL中的multimap模板类来储存修改动作。其中key被设为bool类型,true表明是添加动作,false表明是移除动作。此外,因代码量的增加,内联函数已无必要,故移除了所有的inline关键字。

后记:编写通用库时不能假定用户所处某一特定环境中,因而须谨慎应对各种可能遇到的问题,这便是为什么我们常说库的实现往往比为特定应用而编写的模块要复杂得多的缘故,加之C++语言本身的复杂性以及局限性,以致我们设计一个相对完美的观察者模式是何其困难。

鉴于以上情况,我相信问题远不止如此,真诚希望读者提出你所遇到的各种问题,以便我们一起讨论学习。

<暂完>

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号