zoukankan      html  css  js  c++  java
  • 设计模式复习-观察者模式

    #pragma once
    #include "stdafx.h"
    #include<set>
    #include<list>
    #include<string>
    #include<iostream>
    #include<windows.h>
    using namespace std;
    
    //设计模式-观察者模式Observer
    //定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象
    //这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
    
    
    class CObserver {//抽象接口
    public:
    	virtual void Update() = 0;
    };
    
    class CSubject {//抽象通知者
    private:
    	set<CObserver *> m_HashMemory;
    public:
    	CSubject(){
    		m_HashMemory.clear();
    	}
    
    	~CSubject() {
    		for each(CObserver *i in m_HashMemory) {
    			delete i;
    		}
    	}
    	void Attach(CObserver *pObserver) {
    		m_HashMemory.insert(pObserver);
    	}
    	void Detach(CObserver *pObserver) {
    		m_HashMemory.erase(pObserver);
    		delete pObserver;
    	}
    	void Notify() {
    		for each(CObserver *i in m_HashMemory) {
    			i->Update();
    		}
    	}
    };
    
    
    class CConcreteSubjuct :public CSubject {//具体的通知着
    private:
    	string m_strSubjectState;
    public:
    	CConcreteSubjuct(const string &strName) {
    		m_strSubjectState = strName;
    	}
    	string GetName() {
    		return m_strSubjectState;
    	}
    };
    
    
    class ConcreteObserver :public CObserver{//具体的观察者
    private:
    	string m_strName;
    	string m_strObserverState;
    	CConcreteSubjuct *m_pSubject;
    public:
    	ConcreteObserver(CConcreteSubjuct *pSubject ,const string &strName) {
    		m_pSubject = pSubject;
    		m_strName = strName;
    	}
    	void Update() {
    		m_strObserverState = m_pSubject->GetName();
    		cout << "观察者" << m_strName << "的新状态是" << m_strObserverState << endl;
    	}
    };
    
    
    int main()
    {
    	
    	//一个前台,几个员工
    	CConcreteSubjuct *pQianTai = new CConcreteSubjuct("QianTai");
    	ConcreteObserver *pYuanGongA = new ConcreteObserver(pQianTai ,"YuanGongA");
    	ConcreteObserver *pYuanGongB = new ConcreteObserver(pQianTai, "YuanGongB");
    	ConcreteObserver *pYuanGongC = new ConcreteObserver(pQianTai, "YuanGongC");
    	pQianTai->Attach(pYuanGongA); pQianTai->Attach(pYuanGongB); pQianTai->Attach(pYuanGongC);
    
    	pQianTai->Notify();
    
    	pQianTai->Detach(pYuanGongB);
    
    	pQianTai->Notify();
    	getchar();
    	return 0;
    }
    

     

  • 相关阅读:
    plsql Developer11的工具栏没有了如何找回来
    postman发送HTTP请求自动生成MD5/SHA1签名
    Redis的安装+哨兵模式+集群
    SpringBoot笔记 --- @JsonFormat和@DateTimeFormat的作用
    HBase异常 -- hbase list报错 ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
    Windows使用进阶
    SpringBoot笔记 -- @RequestParam、@RequestBody、@PathVariable、@param
    SpringBoot笔记 -- 注解
    Mybatis笔记 -- 批量操作(查询、插入、更新、删除)
    Git异常 -- 汇总
  • 原文地址:https://www.cnblogs.com/csnd/p/12061916.html
Copyright © 2011-2022 走看看