#include <iostream>
#include <vector>
class Observer;
class Subject {
public:
Subject(std::string action) : action_(action) {}
virtual ~Subject() = default;
virtual void Attach(Observer*) = 0;
virtual void Detach(Observer*) = 0;
virtual void Notify() = 0;
virtual std::string GetSubjectState() = 0;
protected:
std::vector<Observer*> observers_;
std::string action_;
};
class Observer {
public:
Observer(std::string name, Subject* sub) : name_(name), sub_(sub) {}
virtual ~Observer() = default;
virtual void Update() = 0;
protected:
std::string name_;
Subject* sub_;
};
class StockObserver : public Observer {
public:
StockObserver(std::string name, Subject* sub) : Observer(name, sub) {};
~StockObserver() = default;
void Update() override
{
std::cout << this->sub_->GetSubjectState() << ", " << this->name_ << ", close the stock window and work!" << std::endl;
}
};
class Boss : public Subject {
public:
Boss(std::string action) : Subject(action) {}
~Boss() = default;
void Attach(Observer* observer) override
{
observers_.push_back(observer);
}
void Detach(Observer* observer) override
{
auto it = std::find(observers_.begin(), observers_.end(), observer);
observers_.erase(it);
}
void Notify() override
{
for (const auto item : observers_) {
item->Update();
}
}
std::string GetSubjectState() override
{
return action_;
}
};
int main() {
Subject* huhansan = new Boss("I am back");
Observer* tongshi1 = new StockObserver("wenwen", huhansan);
Observer* tongshi2 = new StockObserver("jingjing", huhansan);
huhansan->Attach(tongshi1);
huhansan->Attach(tongshi2);
huhansan->Detach(tongshi1);
huhansan->Notify();
delete huhansan;
delete tongshi1;
delete tongshi2;
}