设计模式之观察者(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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 声明函数指针并实现回调下一篇: C++中如何动态调用dll杀进程
关于设计模式之观察者(Observer)模式与其C++通用实现(下)的所有评论