观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
//Subject类
class Subject
{
private:
vector<Observer*> observers;
public:
//增加观察者
virtual void Attach(Observer *observer)
{
observers.push_back(observer);
}
//溢出观察者
virtual void Detach(Observer *observer)
{
observers.erase(observer);
}
//通知
virtual void Notify()
{
for (size_t i=0; i<observers.size(); ++i)
{
observers[i].Update();
}
}
};
class Observer
{
public:
virtual void Update() = 0;
};
class ConcreteSubject : public Subject
{
private:
string subjectState;
public:
string GetSubjectState() const{return subjectState;}
void SetSubjectState(string state){subjectState = state;}
};
class ConcreteObserver : public Observer
{
private:
string name;
string observerState;
ConcreteSubject *subject;
public:
ConcreteObserver(ConcreteSubject *subject, string name)
{
this->subject = subject;
this->name = name;
}
virtual void Update()
{
observerState = subject->SubjectState;
cout << "观察者" << name << "的新状态是" << observerState << endl;
}
};
void main()
{
ConcreteSubject *s = new ConcreteSubject;
s->Attach(new ConcreteObserve(s,"x");
s->Attach(new ConcreteObserve(s,"Y");
s->Attach(new ConcreteObserve(s,"Z");
s->SubjectState = "ABC";
s->Notify();
}
1.将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便
2.何时使用观察者模式:
1.当一个对象的改变需要同时改变其他对象的时候,而且他不知道具体有多少对象有待改变时。
2.一个抽象模型有两个方面,其中一方面依赖于另一方面,这时使用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。
3.观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不会依赖于具体。从而使得各自的变化都不会影响另一边的变化