zoukankan      html  css  js  c++  java
  • 21行为型模式之观察者模式

    概念

      Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

      Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。

    角色和职责

    Subject(被观察者)
             被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。

    ConcreteSubject
             被观察者的具体实现。包含一些基本的属性状态及其他操作。

    Observer(观察者)
             接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。

    ConcreteObserver
             观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

    典型应用

      - 侦听事件驱动程序设计中的外部事件

      - 侦听/监视某个对象的状态变化

      - 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者

    适用于:

             定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。

    案例

    //定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。

    #include <iostream>
    using namespace std;
    #include "vector"
    #include "string"
    
    class Secretary;
    
    //玩游戏的同事类(观察者)
    class PlayserObserver
    {
    public:
    	PlayserObserver(string name, Secretary *secretary)
    	{
    		m_name = name;
    		m_secretary = secretary;
    	}
    	void update(string action)
    	{
    		cout << "观察者收到action:" << action << endl;
    	}
    private:
    	string		m_name;
    	Secretary	*m_secretary;
    };
    
    //秘书类(主题对象,通知者)
    class Secretary
    {
    public:
    	void addObserver(PlayserObserver *o)
    	{
    		v.push_back(o);
    	}
    	void Notify(string action)
    	{
    		for (vector<PlayserObserver *>::iterator it= v.begin(); it!=v.end(); it++ )
    		{
    			(*it)->update(action);
    		}
    	}
    	void setAction(string action)
    	{
    		m_action = action;
    		Notify(m_action);
    	}
    private:
    	string m_action;
    	vector<PlayserObserver *> v;
    };
    
    void main()
    {
    	//subject 被观察者
    	Secretary *s1 = new Secretary;
    
    	//具体的观察者 被通知对象
    	PlayserObserver *po1 = new PlayserObserver("小张", s1);
    	//PlayserObserver *po2 = new PlayserObserver("小李", s1);
    	s1->addObserver(po1);
    	//s1->addObserver(po2);
    	s1->setAction("老板来了");
    	s1->setAction("老板走了");
    	cout<<"hello..."<<endl;
    	system("pause");
    	return ;
    }
    

      

  • 相关阅读:
    走微软的路,何去何从?
    无须学生edu邮箱免费获得WP8开发者账号与解锁教程
    javascript获取页面宽度高度及屏幕分辨率
    商业思维导图Mindmap软件XMind
    工作笔记软件EverNote
    类的成员函数指针数组
    Live Connect和Live SDK的一些简介
    山寨新浪微博客户端与新浪微博API调用的总结
    Js整理备忘(01)—— 变量作用域
    Js整理备忘(02)——运算符
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10358048.html
Copyright © 2011-2022 走看看