#include<vector>
#include<iostream>
using namespace std;
class Subject;
class Observer
{
public:
~Observer(){}
virtual void update( Subject *observee ) = 0;
};
class Subject
{
public:
virtual ~Subject(){}
virtual void addObserver( Observer *obs )
{
observers.push_back( obs );
}
virtual void removeObserver( Observer *obs )
{
for( int i = 0; i < observers.size( ); i++ )
if( observers[ i ] == obs )
{
observers[ i ] = observers.back( );
observers.pop_back( );
i--;
}
}
virtual void notifyAll()
{
for( int i = 0; i < observers.size(); i++ )
observers[i] -> update (this);
}
private:
vector<Observer *> observers;
};
class Timer : public Subject
{
public:
void tick()
{ notifyAll(); }
};
class Echo : public Observer
{
public:
Echo( int id, Timer *t ) : myId(id), observee (t)
{observee->addObserver (this);}
~Echo()
{ observee->removeObserver (this);}
void update( Subject *s)
{if (observee == s) cout <<myId <<endl;}
private:
int myId;
Subject *observee;
};
void testEcho12( Timer &t)
{
Echo e1(1, &t);
Echo e2(2, &t);
cout<< "Expect 1 and 2 to respond." <<endl;
t.tick();
cout<<"1 and 2 disappear."<<endl;
}
int main()
{
Timer t;
testEcho12(t);
Echo e3(3, &t);
Echo e4(4, &t);
Timer other;
Echo e5(5, &other);
cout<< "Only 3 and 4 are currently observable." <<endl;
cout<< "Expecting 3 and 4 to respond."<<endl;
t.tick();
return 0;
}
设计模式中经典的观察者模式
最新推荐文章于 2024-07-07 23:15:22 发布