muduo前站之观察者模式

作为设计模式之一,观察者模式有必要提前了解一下。

what

先来官方版:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知。这种交互也叫发布-订阅。目标是通知的发布者,他发出通知的时候并不需要知道谁是他的观察者。(最后这一句话之后可能会有歧义出现,之后再讲。先记一下。)
还是用例子解释比较简单一点。同一组数据可能会以不同的图表示出来,柱状,饼状之类的。这些图都依赖这一组数据,当这一组数据发生改变的时候,所有的图也会随之变化。这大概就是我理解的观察者模式的作用。
muduo前站之观察者模式_第1张图片
这是观察者模式的一个结构图(感觉有点像reactor模型,因为都是接口和具体。)还是具体看一下每个部分:

  1. subject:抽象目标,注册和删除观察者对象的接口。
  2. observer:抽象observer,为需要得到通知的对象定义一个接口。
  3. concrete subject:具体目标,将状态存入具体的观察者对象,状态变化时向观察者发出通知。
  4. concrete observer:具体对象,维护一个指向具体目标对象的引用;存储有关状态;实现抽象的更新接口以保持与目标一致。

流程:
目标发生了状态变化,导致观察者可能和本身状态不一,将通知观察者;得到通知后,观察者对象查看目标状态值,使用这个状态更新自己的状态。

how

来一个具体的代码就能理解了。

#include 
#include 
using namespace std;

class Observer
{
public:
	virtual void Update(int) = 0;
};

class Subject
{
public:
	virtual void Attach(Observer*) = 0;
	virtual void Detach(Observer*) = 0;
	virtual void Notify() = 0;
	
};

class ConcreteObserver1 :public Observer
{
public:
	ConcreteObserver1(Subject *subject) :m_subject(subject) {}
	void Update(int status)
	{
		cout << "os1 new status is " << status << endl;
	}

private:
	Subject* m_subject;
};

class ConcreteObserver2 :public Observer
{
public:
	ConcreteObserver2(Subject *subject) :m_subject(subject) {}
	void Update(int status)
	{
		cout << "os2 new status is " << status << endl;
	}

private:
	Subject* m_subject;
};

class ConcreteSubject :public Subject
{
public:
	void Attach(Observer* observer)
	{
		m_lis.push_back(observer);
	}
	void Detach(Observer* observer)
	{
		m_lis.remove(observer);
	}
	void Notify()
	{
		auto it = m_lis.begin();
		for (; it != m_lis.end(); it++)
		{
			Observer* ob = *it;
			ob->Update(status);
		}
	}
	void newstatus(int n)
	{
		this->status = n;
	}

private:
	list<Observer *> m_lis;
	int status;
};

int main()
{
	ConcreteSubject* subject = new ConcreteSubject();

	Observer* t_observer1 = new ConcreteObserver1(subject);
	Observer* t_observer2 = new ConcreteObserver2(subject);

	subject->newstatus(3);

	subject->Attach(t_observer1);
	subject->Attach(t_observer2);

	subject->Notify();

	subject->Detach(t_observer1);

	subject->newstatus(4);
	subject->Notify();

	delete subject;
	delete t_observer1;
	delete t_observer2;

	return 0;

}

结果如下:
在这里插入图片描述
这就是一个简单的观察者模式demo了,其他的就是在此基础上的具体演变了。
这里再说一下一开始那句话。在代码里,可以看到,其实就是目标把观察者加入自己的list了。这样就能通知所有的观察者了。那岂不是就是目标知道观察者,其实subjcet中只是保存了观察者对象的引用,在更改通知发出后,他并不需要知道观察者。通俗来讲,你加入了我们群,我更新一个状态发群里,并不需要知道群里有谁有几个人,我只是发布通知,观察者自己主动去更新自己的状态。
不要纠结于字面的意思把自己陷得太深,按照自己的理解走即可,不要钻进文字的牛角尖。
加油!

你可能感兴趣的:(muduo前站之观察者模式)