zoukankan      html  css  js  c++  java
  • 学习模式----观察者模式(3)

    3.观察者模式一般是一对多关系,肯定有一个发布者,然后有n(n>=0)个订阅者,即观察者;当发布者有新的信息更新时,订阅者都可以接收到新的信息。


    例子:

    // Observers.cpp: 主项目文件。
    
    #include "stdafx.h"
    #include <iostream>
    #include <list>
    #include <numeric>
    #include <algorithm>
    #include <string>
    using namespace System;
    
    using namespace std;
    
    
    class Observers	//观察者
    {
    private:
    	string strOvName;	//观察者名称
    public:
    	 Observers(string strName)	
    	 {
    		strOvName = strName;
    	 }
    
    	 void Update(string strPublisher,string strMesg)	//得到更新信息接口
    	 {
    		cout<<strOvName<< " get Mesg from "<<strPublisher<<"====:"<<strMesg<<endl;
    	 }
    };
    
    public class Publish	//发布者
    {
    private:
    	list<Observers*> observersList;	//收集观察者列表
    	string strNewMesg;	//新的信息
    	string strName;	//发布者名称
    
    public:
    	Publish(string publishName)
    	{
    		strName = publishName;
    	}
    	
    	void SetNewMesg(string strMesg)	//发布新信息
    	{
    		strNewMesg = strMesg;
    	}
    	void Notify()	//通知观察者
    	{
    		list<Observers*>::iterator iter = observersList.begin();
            for(; iter != observersList.end(); iter++)		//遍历列表,给所有观察者发送更新的信息
    		{
    			(*iter)->Update(strName,strNewMesg);
    		}
                
    	}
    
    	void AddObservers(Observers *observer)	//添加观察者
    	{
    		observersList.push_back(observer);
    	}
    
    	void DelObservers(Observers *observer)	//删除观察者
    	{
    		observersList.remove(observer);
    	}
    		
    
    };
    
    
    int main(array<System::String ^> ^args)
    {
    	Publish *publish = new Publish("北京气象台");
    	Observers *ov1 = new Observers("Wyz1");
    	Observers *ov2 = new Observers("Wyz2");
    
    	publish->AddObservers(ov1);		//注册
    	publish->AddObservers(ov2);
    
    	publish->SetNewMesg("北京明日2013-07-25天气:晴 0度 微风");
    	publish->Notify();
      
    	cout<<endl<<endl;
    
    	publish->DelObservers(ov1);		//ov1取消订阅
    	Observers *ov3 = new Observers("Wyz3");
    	publish->AddObservers(ov3);
    
    	publish->SetNewMesg("北京明日2013-07-26天气:晴 100度 狂风");
    	publish->Notify();
    
    
        cout<<"wyz"<<endl;
    
    	system("pause");
    
        return 0;
    }
    


    运行效果:

    Wyz1 get Mesg from 北京气象台====:北京明日2013-07-25天气:晴 0度 微风
    Wyz2 get Mesg from 北京气象台====:北京明日2013-07-25天气:晴 0度 微风




    Wyz2 get Mesg from 北京气象台====:北京明日2013-07-26天气:晴 100度 狂风
    Wyz3 get Mesg from 北京气象台====:北京明日2013-07-26天气:晴 100度 狂风
    wyz
    请按任意键继续. . .








  • 相关阅读:
    四套读取方案
    java的分层开发
    位移运算符
    反射
    多线程下的单例
    学生管理系统
    iOS-分段控制器-基本概念
    iOS-UITableView-处理cell上按钮事件(弹出警示框,页面跳转等)
    iOS-UIScrollView-图片缩放
    Xcode-Xcode 7.3 解决不能自动联想问题
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3217865.html
Copyright © 2011-2022 走看看