Observer design scheme in C ++

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

+5
c ++ design-patterns observer-pattern
source share
8 answers

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; } 
+6
source share

No, but Boost.Signals2 gives you something similar.

+19
source share

As far as I know in C ++, STL does not have an implementation for the Observer pattern. However, there was a suggestion for Signal / Slot for the standard library in TR2.

There are many libraries that provide an implementation of the Qt Observer library, which is one of the pioneers. The boost library has an implementation (see Boost :: Signals and Boost :: Signals2).

The Poco C ++ library has a neat implementation of the observer pattern (see NotificationCenter).

libsigC ++, cpp-events are some of the other libraries that provide signal / slot implementations.

+8
source share

No no. C ++ STL is much smaller than the standard Java library. If you're looking for something for an STL extension that is supported by almost everyone, you should take a look at the Boost libraries. In this case, you can look at Boost.Signals , which provides a signal / slot model.

+6
source share
 #include <iostream> #include <string> #include <set> using namespace std; class Subject; class Observer { public: virtual void update(Subject & subject) = 0; }; // also knows as Observable in literature class Subject { string state; set<Observer*> observers; public: void attachObserver(Observer *o) { observers.insert(o); } void detachObserver(Observer *o) { observers.erase(o); } void notifyObservers() { for (auto &o : observers) { o->update(*this); } } string getState() { return state; } void changeState(const string & s) { state = s; notifyObservers(); } }; class ObserverImpl : public Observer { string state; public: void update(Subject & sbj) override { state = sbj.getState(); } string getState() { return state; } }; int main() { ObserverImpl a, b, c; Subject subject; subject.attachObserver(&a); subject.attachObserver(&b); subject.attachObserver(&c); subject.changeState("Observer pattern"); cout << a.getState() << endl; cout << b.getState() << endl; cout << c.getState() << endl; return 0; } 

also see UML diagrams / sequences http://www.patterns.pl/observer.html

+3
source share

Observer design pattern is not defined in STL . You can refer to the book "Gangs of Four", or a Google search should provide enough information for its implementation. If this question is not answered soon, I will lay out a quick example.

+2
source share
  #include<iostream> #include<string.h> #include<vector> #include<algorithm> using namespace std; class Customer; class flipkart { vector<Customer*>list; vector<Customer*>::iterator it; public: void Register(Customer *customer) { list.push_back(customer); } void unregister(Customer *customer) { list.erase(remove(list.begin(), list.end(),customer), list.end()); } void notify(string item,float vprice); }; class observer { public: virtual void update(string item,float vprice)=0; }; class Customer:public observer { string name; public: Customer(string n) { name=n; } void update(string item,float vprice) { cout<<"**Flipkart**updated price for "<<item<<" is:"<<vprice<<" Rupees only, request recieved by "<<name<<endl; } }; void flipkart::notify(string item,float vprice) { for(it=list.begin();it!=list.end();it++) { (*it)->update(item,vprice); } } class product:public flipkart { public: void change_price(string item,float vprice) { notify(item,vprice); } }; int main() { Customer customer1("Dhoni"),customer2("Yuvraj"),customer3("Kohli"); product LCD; LCD.Register(&customer1); LCD.Register(&customer2); LCD.Register(&customer3); LCD.change_price("LCD HD2 TV",12000); LCD.unregister(&customer2); cout<<"after unregisterng customer2:\n"; LCD.change_price("LCD HD2 TV",11500); } 
0
source share

Flipkart is a shopping website, we all know that whenever we sign up for amazon or flipkart, etc. Regarding notifications of the availability of a particular product or price change with our Gmail account, we will continue to receive updates regarding the product, etc., and if we unsubscribe from this particular site, such as Amazon, it stops sending updates to our Gmail account.

0
source share

All Articles