<small id='BinvQ'></small><noframes id='BinvQ'>

      <bdo id='BinvQ'></bdo><ul id='BinvQ'></ul>
  • <tfoot id='BinvQ'></tfoot>
    1. <i id='BinvQ'><tr id='BinvQ'><dt id='BinvQ'><q id='BinvQ'><span id='BinvQ'><b id='BinvQ'><form id='BinvQ'><ins id='BinvQ'></ins><ul id='BinvQ'></ul><sub id='BinvQ'></sub></form><legend id='BinvQ'></legend><bdo id='BinvQ'><pre id='BinvQ'><center id='BinvQ'></center></pre></bdo></b><th id='BinvQ'></th></span></q></dt></tr></i><div id='BinvQ'><tfoot id='BinvQ'></tfoot><dl id='BinvQ'><fieldset id='BinvQ'></fieldset></dl></div>

        <legend id='BinvQ'><style id='BinvQ'><dir id='BinvQ'><q id='BinvQ'></q></dir></style></legend>
      1. C++中的观察者设计模式

        时间:2023-10-07
          <bdo id='QZGi0'></bdo><ul id='QZGi0'></ul>

          <tfoot id='QZGi0'></tfoot>

          <small id='QZGi0'></small><noframes id='QZGi0'>

          • <legend id='QZGi0'><style id='QZGi0'><dir id='QZGi0'><q id='QZGi0'></q></dir></style></legend>
            1. <i id='QZGi0'><tr id='QZGi0'><dt id='QZGi0'><q id='QZGi0'><span id='QZGi0'><b id='QZGi0'><form id='QZGi0'><ins id='QZGi0'></ins><ul id='QZGi0'></ul><sub id='QZGi0'></sub></form><legend id='QZGi0'></legend><bdo id='QZGi0'><pre id='QZGi0'><center id='QZGi0'></center></pre></bdo></b><th id='QZGi0'></th></span></q></dt></tr></i><div id='QZGi0'><tfoot id='QZGi0'></tfoot><dl id='QZGi0'><fieldset id='QZGi0'></fieldset></dl></div>
                    <tbody id='QZGi0'></tbody>

                  本文介绍了C++中的观察者设计模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  观察者设计模式是否已经在 STL 中定义(如 Java 中的 java.util.Observer 和 java.util.Observable)?

                  Is the observer design pattern already defined in STL (Like the java.util.Observer and java.util.Observable in Java) ?

                  推荐答案

                  这里是一个参考实现(来自 维基百科).

                  Here is a reference implementation (from Wikipedia).

                  #include <iostream>
                  #include <string>
                  #include <map>
                  #include <boost/foreach.hpp>
                  
                  class SupervisedString;
                  class IObserver{
                  public:
                      virtual void handleEvent(const SupervisedString&) = 0;
                  };
                  
                  
                  class SupervisedString{ // Observable class
                      std::string _str;
                      std::map<IObserver* const, IObserver* const> _observers;
                  
                      typedef std::map<IObserver* const, IObserver* const>::value_type item;
                  
                      void _Notify(){
                          BOOST_FOREACH(item iter, _observers){
                              iter.second->handleEvent(*this);
                          }
                      }
                  
                  public:
                      void add(IObserver& ref){
                          _observers.insert(item(&ref, &ref));
                      }
                  
                      void remove(IObserver& ref){
                          _observers.erase(&ref);
                      }
                  
                      const std::string& get() const{
                          return _str;
                      }
                  
                      void reset(std::string str){
                          _str = str;
                          _Notify();
                      }
                  };
                  
                  
                  class Reflector: public IObserver{ // Prints the observed string into std::cout
                  public:
                      virtual void handleEvent(const SupervisedString& ref){
                          std::cout<<ref.get()<<std::endl;
                      }
                  };
                  
                  class Counter: public IObserver{  // Prints the length of observed string into std::cout
                      virtual void handleEvent(const SupervisedString& ref){
                          std::cout<<"length = "<<ref.get().length()<<std::endl;
                      }
                  };
                  
                  int main(){
                  
                      SupervisedString str;
                      Reflector refl;
                      Counter    cnt;
                  
                      str.add(refl);
                      str.reset("Hello, World!");
                      std::cout<<std::endl;
                  
                      str.remove(refl);
                      str.add   (cnt);
                      str.reset("World, Hello!");
                      std::cout<<std::endl;
                  
                      return 0;
                  }
                  

                  这篇关于C++中的观察者设计模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:返回“NULL 引用"在 C++ 中? 下一篇:在对象工厂中注册对象创建者

                  相关文章

                  最新文章

                  <small id='Az5yK'></small><noframes id='Az5yK'>

                • <i id='Az5yK'><tr id='Az5yK'><dt id='Az5yK'><q id='Az5yK'><span id='Az5yK'><b id='Az5yK'><form id='Az5yK'><ins id='Az5yK'></ins><ul id='Az5yK'></ul><sub id='Az5yK'></sub></form><legend id='Az5yK'></legend><bdo id='Az5yK'><pre id='Az5yK'><center id='Az5yK'></center></pre></bdo></b><th id='Az5yK'></th></span></q></dt></tr></i><div id='Az5yK'><tfoot id='Az5yK'></tfoot><dl id='Az5yK'><fieldset id='Az5yK'></fieldset></dl></div>

                        <bdo id='Az5yK'></bdo><ul id='Az5yK'></ul>

                    1. <tfoot id='Az5yK'></tfoot>
                      <legend id='Az5yK'><style id='Az5yK'><dir id='Az5yK'><q id='Az5yK'></q></dir></style></legend>