Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Example program
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- #include <memory>
- struct IDisposableObserver;
- struct IObservable
- {
- virtual void add(IDisposableObserver* observer) = 0;
- virtual void remove(IDisposableObserver* observer) = 0;
- };
- struct IDisposableObserver
- {
- IObservable* obs;
- IDisposableObserver(IObservable* o) : obs(o) {}
- virtual void notify() = 0;
- virtual ~IDisposableObserver()
- {
- std::cout << "~IDisposableObserver(): Dispose observer" << std::endl;
- obs->remove(this);
- }
- };
- struct Endpoint : public IDisposableObserver
- {
- Endpoint(const std::string& ldn, IObservable* obs) : IDisposableObserver(obs)
- {
- obs->add(this);
- }
- virtual void notify()
- {
- std::cout << "Notify " << std::endl;
- }
- };
- struct Server
- {
- std::vector<std::unique_ptr<Endpoint>> endpoints;
- void publishEndpoint(const std::string& ldn, IObservable* observable)
- {
- auto endpoint = std::make_unique<Endpoint>(ldn, observable);
- endpoints.push_back(std::move(endpoint));
- }
- };
- struct Fru : public IObservable
- {
- std::vector<IDisposableObserver*> observers;
- void add(IDisposableObserver* observer) override
- {
- auto it = std::find_if(observers.begin(), observers.end(), [&](const IDisposableObserver* ptr) { return ptr == observer; } );
- if (it != observers.end())
- {
- return;
- }
- observers.push_back(observer);
- }
- void remove(IDisposableObserver* observer) override
- {
- auto it = std::find_if(observers.begin(), observers.end(), [&](const IDisposableObserver* ptr) { return ptr == observer; } );
- if (it != observers.end())
- {
- return;
- }
- observers.erase(it);
- }
- void doIt()
- {
- for (const auto& x : observers)
- {
- x->notify();
- }
- }
- };
- int main()
- {
- Fru fru{};
- {
- Server usi{};
- usi.publishEndpoint("ldn=1", &fru);
- }
- fru.doIt();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement