#include <iostream>
#include <set>
using namespace std;
struct EventHandle {};
class Subject;
class Observer {
public:
virtual void OnEvent(const EventHandle& h, Subject& affectedItem) = 0;
virtual ~Observer() {} // virtual function ? => better foresee a virtual destructor
};
class Subject {
public:
void AddObserver(Observer* o) {
observers.insert(o);
}
void RemoveObserver(Observer* o) {
//observers.remove(o);
}
void Notify(const EventHandle& h, Subject& affectedItem) {
for (Observer* o : observers) {
o->OnEvent(h, affectedItem);
}
}
private:
set<Observer*> observers;
};
struct ConcreteObserverA : Observer {
void OnEvent(const EventHandle& h, Subject& affectedItem) override {
cout<<"A:"<<&affectedItem<<endl;
}
};
struct ConcreteObserverB : Observer {
void OnEvent(const EventHandle& h, Subject& affectedItem) override {
cout<<"B:"<<&affectedItem<<endl;
}
};
struct ConcreteSubjectSA : Subject { };
struct ConcreteSubjectSB : Subject { };
int main() {
ConcreteSubjectSA sa1;
ConcreteSubjectSB sb1;
ConcreteObserverA a1;
ConcreteObserverB b1;
sa1.AddObserver(&a1);
sa1.AddObserver(&b1);
sb1.AddObserver(&b1);
sa1.Notify (EventHandle{}, sa1);
sb1.Notify (EventHandle{}, sb1);
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEV2ZW50SGFuZGxlIHt9OwoKY2xhc3MgU3ViamVjdDsgCmNsYXNzIE9ic2VydmVyIHsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIE9uRXZlbnQoY29uc3QgRXZlbnRIYW5kbGUmIGgsIFN1YmplY3QmIGFmZmVjdGVkSXRlbSkgPSAwOwogICAgdmlydHVhbCB+T2JzZXJ2ZXIoKSB7fSAgLy8gdmlydHVhbCBmdW5jdGlvbiA/ID0+IGJldHRlciBmb3Jlc2VlIGEgdmlydHVhbCBkZXN0cnVjdG9yCn07CgpjbGFzcyBTdWJqZWN0IHsKcHVibGljOgogICAgdm9pZCBBZGRPYnNlcnZlcihPYnNlcnZlciogbykgewogICAgICAgIG9ic2VydmVycy5pbnNlcnQobyk7CiAgICB9CiAgICB2b2lkIFJlbW92ZU9ic2VydmVyKE9ic2VydmVyKiBvKSB7CiAgICAgICAgLy9vYnNlcnZlcnMucmVtb3ZlKG8pOwogICAgfQogICAgdm9pZCBOb3RpZnkoY29uc3QgRXZlbnRIYW5kbGUmIGgsIFN1YmplY3QmIGFmZmVjdGVkSXRlbSkgewogICAgICAgIGZvciAoT2JzZXJ2ZXIqIG8gOiBvYnNlcnZlcnMpIHsKICAgICAgICAgICAgby0+T25FdmVudChoLCBhZmZlY3RlZEl0ZW0pOwogICAgICAgIH0KICAgIH0KcHJpdmF0ZToKICAgIHNldDxPYnNlcnZlcio+IG9ic2VydmVyczsKfTsKCnN0cnVjdCBDb25jcmV0ZU9ic2VydmVyQSA6IE9ic2VydmVyIHsKICAgIHZvaWQgT25FdmVudChjb25zdCBFdmVudEhhbmRsZSYgaCwgU3ViamVjdCYgYWZmZWN0ZWRJdGVtKSBvdmVycmlkZSB7CiAgICAJY291dDw8IkE6Ijw8JmFmZmVjdGVkSXRlbTw8ZW5kbDsKICAgIH0KCQp9OwpzdHJ1Y3QgQ29uY3JldGVPYnNlcnZlckIgOiBPYnNlcnZlciB7CiAgICB2b2lkIE9uRXZlbnQoY29uc3QgRXZlbnRIYW5kbGUmIGgsIFN1YmplY3QmIGFmZmVjdGVkSXRlbSkgb3ZlcnJpZGUgewogICAgCWNvdXQ8PCJCOiI8PCZhZmZlY3RlZEl0ZW08PGVuZGw7CiAgICB9Cn07CgpzdHJ1Y3QgQ29uY3JldGVTdWJqZWN0U0EgOiBTdWJqZWN0IHsgfTsKc3RydWN0IENvbmNyZXRlU3ViamVjdFNCIDogU3ViamVjdCB7IH07CgoKaW50IG1haW4oKSB7CgkgQ29uY3JldGVTdWJqZWN0U0Egc2ExOwoJIENvbmNyZXRlU3ViamVjdFNCIHNiMTsgCgkgQ29uY3JldGVPYnNlcnZlckEgYTE7IAoJIENvbmNyZXRlT2JzZXJ2ZXJCIGIxOyAKCSBzYTEuQWRkT2JzZXJ2ZXIoJmExKTsKCSBzYTEuQWRkT2JzZXJ2ZXIoJmIxKTsKCSBzYjEuQWRkT2JzZXJ2ZXIoJmIxKTsKCSBzYTEuTm90aWZ5IChFdmVudEhhbmRsZXt9LCBzYTEpOwoJIHNiMS5Ob3RpZnkgKEV2ZW50SGFuZGxle30sIHNiMSk7CgoJIAoJCgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==