C++常见设计模式之观察者模式

观察者模式:
定义对象间的一种一对多的依赖关系,将对象分为观察者与被观察者,当被观察者的状态发生改变时。观察者会及时的收到通知并且及时的进行数据更新,当被观察者发生改变时,所有关注它的观察者都会得到通知。

它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。举个博客订阅的例子,当博主发表新文章的时候,即博主状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。博主(被观察者)与读者(观察者)之间存在种一对多的依赖关系。

//观察者
class Observer
{
    
    
public:
	Observer()
	{
    
    

	}

	virtual ~Observer()
	{
    
    

	}

	virtual void Update()
	{
    
    
 
	}
};

// 被观察者

class Blog
{
    
    
private:
	list<Observer*>m_observers; //观察者链表
public:
	string m_status; //被观察者状态
public:
	Blog()
	{
    
    

	}
	virtual~Blog()
	{
    
    

	}

	void Attach(Observer*  observer) //添加观察者
	{
    
    
		m_observers.push_back(observer);
	}

	void Remove(Observer*  observer) //移除观察者 (屏蔽,不让他看)
	{
    
    
		m_observers.remove(observer);
	}

	void Notify()//通知观察者
	{
    
    
		list<Observer*>::iterator ite = m_observers.begin();

		while(ite!=m_observers.end()){
    
    
			(*ite)->Update(); //观察者更新状态
			ite++;
		}

	}

	virtual void SetStatus(string s) //设置被观察者状态
	{
    
     
		m_status = s;
	}


	virtual string GetStatus() //获得被观察者状态
	{
    
    
		return m_status;
	}

};

//以上是观察者和博客(被观察者)的基类,博客类主要完成观察者的添加,移除,通知操作,
//设置和获得状态是一个虚函数,具体需要在子类里实现


//具体的博客类
class BlogCSDN:public Blog
{
    
    
private:
	string m_name;

public:
	BlogCSDN(string name)
	{
    
    
		m_name = name;
	}
	~BlogCSDN()
	{
    
    

	}

	void SetStatus(string s)
	{
    
    
		m_status = "CSDN 通知:" + m_name + s;  //设置具体状态
	}

	string GetStatus()
	{
    
    
		return m_status;
	}
};

//具体的观察者
class ObserverBlog:public Observer
{
    
    
private:
	string m_name; //观察者名称
	Blog *m_blog;  //观察哪个博客(也可以链表的形式 观察多个博客)

public:
	ObserverBlog(string name,Blog *blog)
	{
    
    
		m_name = name;
		m_blog = blog;
	}
	~ObserverBlog()
	{
    
    
	}

	void Update() //更新状态
	{
    
    
		string status = m_blog->GetStatus();
		cout<<m_name<<"-----"<<status<<endl;
	}
};

int main()
{
    
    
	Blog *p = new BlogCSDN("鸟鸟Wink");
	Observer* Observer1 = new ObserverBlog("1号观察者",p);
	Observer* Observer2 = new ObserverBlog("2号观察者",p);

	p->Attach(Observer1);
	p->Attach(Observer2);

	p->SetStatus("正在更新有关设计模式的博客。");
	p->Notify();

	p->Remove(Observer1);

	p->SetStatus("正在更新有关算法的博客。");
	p->Notify();

	delete p;
	delete Observer1;
	delete Observer2;

	return 0;
}

在这里插入图片描述
部分内容参考于:https://blog.csdn.net/wuzhekai1985/article/details/6674984

Guess you like

Origin blog.csdn.net/scarificed/article/details/121306119