64,648
社区成员
发帖
与我相关
我的任务
分享
#ifndef Observer_hpp
#define Observer_hpp
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
class Observer;
class Subject{
public:
virtual void attach(Observer* o);
virtual void detach(Observer* o);
virtual void notify();
virtual std::string getStatus();
virtual void setStatus(const std::string &s);
virtual ~Subject()=0;
};
class Observer{
public:
virtual void setSubject(Subject *s);
virtual void update();
virtual ~Observer()=0;
};
class ConcreteSubject: public Subject{
std::vector<Observer*> v;
std::string status;
public:
void attach(Observer *o);
void detach(Observer *o);
void notify();
void setStatus(const std::string &s);
std::string getStatus();
};
class ConcreteObserver:public Observer{
std::string name_;
Subject *subject_;
public:
ConcreteObserver(const std::string &s):name_(s){}
void update();
void setSubject(Subject *s);
};
#endif /* Observer_hpp */
#include "Observer.hpp"
Subject::~Subject(){}
Observer::~Observer(){}
//void ConcreteSubject::attach(Observer *o){
// o->setSubject(this);
// v.push_back(o);
//}
void ConcreteSubject::detach(Observer *o){
auto i=v.begin();
for(;*i!=o&&i!=v.end();i++);
if(i!=v.end()){
v.erase(i);
}
}
void ConcreteSubject::setStatus(const std::string &s){
status=s;
notify();
}
std::string ConcreteSubject::getStatus(){
return status;
}
void ConcreteSubject::notify(){
for(auto &i:v){
i->update();
}
}
void ConcreteObserver::setSubject(Subject *s){
subject_=s;
}
//
//void ConcreteObserver::update(){
// std::cout<<name_<<"收到消息:"<<subject_->getStatus()<<std::endl;
//
//}