V0.1 传统方式
class StockTeammate
{
public:
StockTeammate(std::string arg, Secretary& sec);
void update();
private:
std::string name;
};
class Secretary
{
public:
void add(StockTeammate& s);
void alarm();
private:
std::vector<StockTeammate> teammate;
};
StockTeammate::StockTeammate(string arg, Secretary& s):name(arg)
{
s.add(*this);
}
void StockTeammate::update()
{
cout<<name<<" close stock and go to work"<<endl;
}
void Secretary::add(StockTeammate& s)
{
teammate.push_back(s);
}
void Secretary::alarm()
{
vector<StockTeammate>::iterator it = teammate.begin();
while(it!= teammate.end())
{
it->update();
it++;
}
}
V0.2 对于听众进行抽象
class Teammate
{
public:
Teammate();
Teammate(std::string arg, Secretary& sec);
virtual ~Teammate();
virtual void update()=0;
protected:
std::string name;
};
class StockTeammate:public Teammate
{
public:
StockTeammate(std::string arg, Secretary& sec);
void update();
};
class NbaTeammate:public Teammate
{
public:
NbaTeammate(std::string arg, Secretary& sec);
void update();
};
class Secretary
{
public:
void add(Teammate& s);
void alarm();
private:
std::vector<Teammate*> teammate;
};
Teammate::Teammate()
{
}
Teammate::Teammate(string arg, Secretary& s):name(arg)
{
s.add(*this);
}
Teammate::~Teammate()
{
}
StockTeammate::StockTeammate(string arg, Secretary& s):Teammate(arg, s)
{
}
void StockTeammate::update()
{
cout<<name<<" close stock and go to work"<<endl;
}
NbaTeammate::NbaTeammate(string arg, Secretary& s):Teammate(arg, s)
{
}
void NbaTeammate::update()
{
cout<<name<<" close NBA and go to work"<<endl;
}
void Secretary::add(Teammate& s)
{
teammate.push_back(&s);
}
void Secretary::alarm()
{
vector<Teammate*>::iterator it = teammate.begin();
while(it!= teammate.end())
{
(*it)->update();
it++;
}
}
V0.3对于观察者进行抽象
class Observer;
class Teammate
{
public:
Teammate();
Teammate(std::string arg, Observer& sec);
virtual ~Teammate();
virtual void update()=0;
protected:
std::string name;
};
class StockTeammate:public Teammate
{
public:
StockTeammate(std::string arg, Observer& sec);
void update();
};
class NbaTeammate:public Teammate
{
public:
NbaTeammate(std::string arg, Observer& sec);
void update();
};
class Observer
{
public:
virtual ~Observer();
void add(Teammate& t);
virtual void alarm()=0;
protected:
std::vector<Teammate*> teammate;
};
class Secretary:public Observer
{
public:
void alarm();
};
class Boss:public Observer
{
public:
void alarm();
};
Teammate::Teammate()
{
}
Teammate::Teammate(string arg, Observer& s):name(arg)
{
s.add(*this);
}
Teammate::~Teammate()
{
}
StockTeammate::StockTeammate(string arg, Observer& s):Teammate(arg, s)
{
}
void StockTeammate::update()
{
cout<<name<<" close stock and go to work"<<endl;
}
NbaTeammate::NbaTeammate(string arg, Observer& s):Teammate(arg, s)
{
}
void NbaTeammate::update()
{
cout<<name<<" close NBA and go to work"<<endl;
}
Observer::~Observer()
{}
void Observer::add(Teammate& s)
{
teammate.push_back(&s);
}
void Secretary::alarm()
{
cout<<"This is Secretary alarm!"<<endl;
vector<Teammate*>::iterator it = teammate.begin();
while(it!= teammate.end())
{
(*it)->update();
it++;
}
}
void Boss::alarm()
{
cout<<"This is Boss alarm!"<<endl;
vector<Teammate*>::iterator it = teammate.begin();
while(it!= teammate.end())
{
(*it)->update();
it++;
}
}
执行文件
int main()
{
Secretary s;
Boss b;
StockTeammate st1("Tom", s);
StockTeammate st2("Terry", b);
NbaTeammate nt1("John", s);
s.alarm();
b.alarm();
return 0;
}