<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      c++11優化觀察者模式

      1. 觀察者模式,一般是通過c++繼承強耦合關系來實現的,代碼如下:

      interface.h

      #ifndef EFWEIFOWEJOFWOEFJWOEF_h
      #define EFWEIFOWEJOFWOEFJWOEF_h
      #include <iostream>
      #include <list>
      using namespace std;

      class Observer
      {
      public:
          virtual void Update(int) = 0;
      };

      class Subject
      {
      public:
          virtual void Attach(Observer *) = 0;
          virtual void Detach(Observer *) = 0;
          virtual void Notify() = 0;
      };

      #endif

      observe.h

      #include "interface.h"
      class ConcreteObserver : public Observer
      {
      public:
          ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){}

          void Update(int value)
          {
              cout << "ConcreteObserver get the update. New State:" << value << endl;
          }

      private:
          Subject *m_pSubject;
      };

      class ConcreteObserver2 : public Observer
      {
      public:
          ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){}

          void Update(int value)
          {
              cout << "ConcreteObserver2 get the update. New State:" << value << endl;
          }

      private:
          Subject *m_pSubject;
      };

       

      subject.h

      #ifndef FOWEJWEIFOWEFJWEOFJWFJWJFWEFIWOEFWEWF_H
      #define FOWEJWEIFOWEFJWEOFJWFJWJFWEFIWOEFWEWF_H
      #include "interface.h"

      class ConcreteSubject : public Subject
      {
      public:
          void Attach(Observer *pObserver);
          void Detach(Observer *pObserver);
          void Notify();

          void SetState(int state)
          {
              m_iState = state;
          }

      private:
          std::list<Observer *> m_ObserverList;
          int m_iState;
      };
      #endif

       

      subject.cpp

      #include "subject.h"

      void ConcreteSubject::Attach(Observer *pObserver)
      {
          m_ObserverList.push_back(pObserver);
      }

      void ConcreteSubject::Detach(Observer *pObserver)
      {
          m_ObserverList.remove(pObserver);
      }

      void ConcreteSubject::Notify()
      {
          std::list<Observer *>::iterator it = m_ObserverList.begin();
          while (it != m_ObserverList.end())
          {
              (*it)->Update(m_iState);
              ++it;
          }
      }

       

      main.cpp

      #include "subject.h"

      #include "observe.h"

      int main()
      {
          // Create Subject
          ConcreteSubject *pSubject = new ConcreteSubject();

          // Create Observer
          Observer *pObserver = new ConcreteObserver(pSubject);
          Observer *pObserver2 = new ConcreteObserver2(pSubject);

          // Change the state
          pSubject->SetState(2);

          // Register the observer
          pSubject->Attach(pObserver);
          pSubject->Attach(pObserver2);

          pSubject->Notify();

          // Unregister the observer
          pSubject->Detach(pObserver);

          pSubject->SetState(3);
          pSubject->Notify();

          delete pObserver;
          delete pObserver2;
          delete pSubject;
              return 0;
      }

      編譯:

      g++ interface.h subject.h observe.h subject.cpp main.cpp -std=c++11 -o test

      ./test

      ConcreteObserver get the update. New State:2
      ConcreteObserver2 get the update. New State:2
      ConcreteObserver2 get the update. New State:3

       

      2. 用C++11 改進觀察者模式

      #include <iostream>
      #include <functional>
      #include <string>
      #include <map>
      #include <algorithm>
      using namespace std;

      class NonCopyable
      {
      protected:
              NonCopyable() = default;
              ~NonCopyable() = default;
              NonCopyable(const NonCopyable&) = delete;
              NonCopyable& operator= (const NonCopyable&) = default;
      };

      template <typename Func>
      class Events : public NonCopyable
      {
      public:
              Events(){}
              ~Events(){}

              //注冊觀察者, 支持右值引用
              int Connect(Func&& f){
                      return Assign(f);
              }

              //注冊觀察者
              int Connect(Func& f){
                      return Assign(f);
              }

              //移除觀察者
              void Disconnect(int key){
                      m_connections.erase(key);
              }

              //通知所有的觀察者
              template <typename... Args>
              void Notify(Args&& ... args){
                      for(auto& it : m_connections){
                              it.second(std::forward<Args>(args)...);
                      }
              }

      private:
              //保存觀察者并分配觀察者的編號
              template <typename F>
              int Assign(F&& f){
                      int k = m_observerId++;
                      m_connections.emplace(k, std::forward<F>(f));
                      return k;
              }

      private:
              int m_observerId = 0;   //觀察者編號

             std::map<int, Func> m_connections;      //觀察者列表

      };

      struct stA
      {
              int a;
              int b;
              void printstA(int a, int b){ std::cout << a << ", " << b << std::endl; }
      };

      struct print
      {
              print& operator()(int a, int b){
                      std::cout << a << ", " << b << std::endl;
              }
      };

      int main()
      {
              Events<std::function<void(int, int)> > myevent;
              auto key = myevent.Connect(print());

              stA t;
              auto lambdakey = myevent.Connect([&t](int a, int b){ t.a = a; t.b = b; } );


              //std::function 注冊
              std::function<void(int, int)> f = std::bind(&stA::printstA, &t, std::placeholders::_1, std::placeholders::_2);
              myevent.Connect(f);

              int a =1, b =2;
              myevent.Notify(a,b);
              myevent.Disconnect(key);

              return 0;
      } 

       

      posted @ 2019-05-31 09:46  HenryLiuY  閱讀(722)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲一区二区三区丝袜| 国产人妻丰满熟妇嗷嗷叫| 亚洲精品国产一二三区| 国产毛片精品av一区二区| 久久夜色国产噜噜亚洲av| 他掀开裙子把舌头伸进去添视频 | 亚洲免费观看视频| 国产视频一区二区三区四区视频 | 2019国产精品青青草原| 2020国产欧洲精品网站| 99riav精品免费视频观看| 日本一卡2卡3卡四卡精品网站| 中文国产成人久久精品小说| 日本高清中文字幕免费一区二区| 人人澡人人透人人爽| 国产成人精品视频不卡| 四虎影视永久在线精品| 久久精品国产午夜福利伦理| 国产亚洲亚洲国产一二区| 亚洲日韩一区精品射精| 自偷自拍亚洲综合精品| 国产精品一级久久黄色片| 一区二区三区无码免费看| 久播影院无码中文字幕| 另类专区一区二区三区| 亚洲国产精品成人精品无码区在线 | 人人妻人人玩人人澡人人爽| 人妻少妇精品视频专区| 免费国产一级特黄aa大片在线| 亚洲精品中文av在线| 日韩免费无码人妻波多野| 小伙无套内射老熟女精品| 国产99青青成人A在线| 隆昌县| 久久久久久久久久久久中文字幕| 秋霞AV鲁丝片一区二区| 亚洲欧洲精品一区二区| 国产老头多毛Gay老年男 | 日韩av综合中文字幕| 国产女同疯狂作爱系列| 精品无码久久久久久久久久|