9. Паттерны Singleton, Strategy, Decorator, Observer (1186015), страница 2
Текст из файла (страница 2)
Тогда так: каждый субъект хранит контейнеруказателей ????_ptr на своих наблюдателей.Пример: паттерн Observerclass Observer {std::string name;public:Observer(const std::string& s) : name(s) {}void Notify(const std::string& source) {/*...*/ }};class Observable {std::string name;public:void Subscribe(std::shared_ptr<Observer> observer);void Unsubscribe(std::shared_ptr<Observer> observer);void Notify();Observable(const std::string& s) : name(s) {}private:std::vector<std::weak_ptr<Observer>> observers;};Пример: паттерн Observervoid Observable::Subscribe (std::shared_ptr<Observer> observer) {observers.push_back(observer);}void Observable::Notify() {for (auto wptr: observers) {if (!wptr.expired()) {auto observer = wptr.lock();observer->Notify(this->name);}}}void Observable::Unsubscribe(std::shared_ptr<Observer> observer) {observers.erase(std::remove_if(observers.begin(),observers.end(),[&](const std::weak_ptr<Observer>& wptr) {return wptr.expired() || wptr.lock() == observer;}),observers.end());}Пример: паттерн Observer.