大话设计模式C++实现-第14章-观察者模式

2015-01-24 05:39:16 · 作者: · 浏览: 3

一、UML图

\

二、概念

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PHN0cm9uZz7I/aGiy7XD9zwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz69x8mro7o8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+o6gxo6lTdWJqZWN0wOCjujwvc3Ryb25nPr/J0tS3rdLrzqrW98ziu/LV37Ppz/PNqNaq1d+jrNK7sOPTw9K7uPaz6c/zwOC78tXf0ru49r3Tv9rKtc/WoaPL+7DRy/nT0LbUuduy7NXfttTP87XE0v3Tw7GjtObU2tK7uPa+27yvwO+jrMO/uPbW98zitry/ydLU09DIzrrOyv3Bv7XEuduy7NXfoaOz6c/z1vfM4szhuanSu7j2vdO/2qOsv8nS1NT2vNO6zcm+s/2527Ls1d+21M/zoaM8L3A+CjxwPjxzdHJvbmc+o6gyo6lPYnNlcnZlcsDgo7o8L3N0cm9uZz6z6c/zuduy7NXfo6zOqsv509C1xL7fzOW527Ls1d+2qNLl0ru49r3Tv9qjrNTatcO1vdb3zOK1xM2o1qrKsbj80MLX1Ly6oaPV4rj2vdO/2r3Q1/a4/NDCvdO/2qGjs+nP87nbsuzV39K7sOPTw9K7uPaz6c/zwOC78tXf0ru49r3Tv9rKtc/WoaO4/NDCvdO/2s2os6Ow/Lqs0ru49lVwZGF0ZSgpt723qKOs1eK49re9t6i90Nf2uPzQwre9t6ihozwvcD4KPHA+PHN0cm9uZz6jqDOjqUNvbmNyZXRlU3ViamVjdMDgo7o8L3N0cm9uZz690Nf2vt/M5db3zOK78tXfvt/M5c2o1qrV36OsvavT0LnY17TMrLTmyOu+38zluduy7NXfttTP86O71Nq+38zl1vfM4rXExNqyv9e0zKy4xLHkyrGjrLj4y/nT0LXHvMe5/bXEuduy7NXft6Kz9s2o1qqhozwvcD4KPHA+PHN0cm9uZz6jqDSjqUNvbmNyZXRlT2JzZXJ2ZXLA4KO6PC9zdHJvbmc+vt/M5bnbsuzV36OsyrXP1rPpz/O527Ls1d+9x8mry/nSqsfztcS4/NDCvdO/2qOs0tSx48q5sb7J7bXE17TMrNPr1vfM4rXE17TMrM/g0K2196Gjvt/M5bnbsuzV373Hyau/ydLUsaO05tK7uPbWuM/yvt/M5db3zOK21M/ztcTS/dPDoaM8L3A+CjxwPjxzdHJvbmc+yrLDtMqxuvLTw7nbsuzV38Sjyr2jvzwvc3Ryb25nPjwvcD4KPHA+o6gxo6m1sdK7uPa21M/ztcS4xLHk0OjSqs2syrG4xLHkxuTL+7bUz/O1xMqxuvKjuzwvcD4KPHA+o6gyo6m2+MfSsrvWqrXAvt/M5dPQtuDJ2bbUz/PT0LT9uMSx5Mqxo6zTprjDv7zCx8q508O527Ls1d/Eo8q9o7s8L3A+CjxwPqOoM6OptbHSu7j2s+nP88Sj0M3T0MG9uPa3vcPmo6zG5NbQ0ru3vcPm0sDAtdPawe3Su7e9w+ajrNXiyrHTw7nbsuzV38Sjyr2/ydLUvavV4sG91d+34tew1Nq2wMGitcS21M/z1tDKucv7w8e499fUtsDBorXYuMSx5LrNuLTTw6GjPC9wPgo8cD48c3Ryb25nPrG+1sqjujwvc3Ryb25nPjwvcD4KPHA+uduy7NXfxKPKvcv51/a1xLmk1/fG5Mq1vs3Kx9TaveKz/fHuus+jrMjD8e66z7XEy6u3vba80sDAtdPas+nP86Ostviyu8rH0sDAtdPavt/M5aGjtNO2+Mq5tcO499fUtcSx5Luvtryyu7vh07DP7MHt0rux37XEseS7r6GjPC9wPgo8cD48c3Ryb25nPsvEoaJDJiM0MzsmIzQzO8q1z9Y8L3N0cm9uZz48L3A+CjxwPqOoMaOpU3ViamVjdC5oPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">#ifndef SUBJECT_H #define SUBJECT_H #include #include class Observer; //Subject,抽象通知者或者主题 class Subject { protected: std::string SubjectState; public: virtual void Attach(Observer* observer)=0; virtual void Detach(Observer* observer)=0; virtual void Notify()=0; std::string GetSubjectState(); void SetSubjectState(std::string state); }; //ConcreteSubject,具体通知者或者具体主题。 class Boss:public Subject { private: std::list observers; std::string action; public: void Attach(Observer* observer); void Detach(Observer* observer); void Notify(); }; #endif

(2)Subject.cpp

#include "Subject.h"
#include "Observer.h"

std::string Subject::GetSubjectState()
{
	return SubjectState;
}
void Subject::SetSubjectState(std::string state)
{
	this->SubjectState=state;
}

void Boss::Attach(Observer* observer)
{
	observers.push_back(observer);
}
void Boss::Detach(Observer* observer)
{
	std::list
  
   ::iterator it;
	for(it=observers.begin();it!=observers.end();it++)
	{
		if(*it==observer)
		{
			observers.erase(it);
			break;
		}
	}
}
void Boss::Notify()
{
	std::list
   
    ::iterator it; for(it=observers.begin();it!=observers.end();it++) { (**it).Update(); } }
   
  


(3)Observer.h

#ifndef OBSERVER_H
#define OBSERVER_H

#include 
  
   
#include 
   
     #include 
    
      #include "Subject.h" //Observer,抽象观察者 class Observer { protected: std::string name; Subject* sub; public: Observer(); Observer(std::string name,Subject* sub); virtual void Update(); bool operator==(const Observer&)const; }; //ConcreteObserver,具体观察者,股票观察者 class StockObserver:public Observer { public: StockObserver(); StockObserver(std::string name,Subject* sub); void Update(); }; //ConcreteObserver,具体观察者,NBA观察者 class NBAObserver:public Observer { public: NBAObserver(); NBAObserver(std::string name,Subject* sub); void Update(); }; #endif
    
   
  


(4)Observer.cpp

#include "Observer.h"

Observer::Observer(){}

Observer::Observer(std::string name,Subject* sub)
{
	this->name=name;
	this->sub=sub;
}

void Observer::Update()
{
	std::cout<<"Observer.Update()"<
  
   name==observer.name)&&(this->sub==observer.sub);
}


StockObserver::StockObserver(){}

StockObserver::StockObserver(std::string name,Subject* sub)
{
	this->name=name;
	this->sub=sub;
}

void StockObserver::Update()
{
	std::cout<
   
    GetSubjectState()<<" "<
    
     name=name; this->sub=sub; } void NBAObserver::Update() { std::cout<
     
      GetSubjectState()<<" "<
       
       

(5)Client.cpp


#include "Observer.h"
#include 
        
         
#include 
         
           //Client,客户端 void main() { //通知者 Subject* huhansan=new Boss(); //4个观察者实例 Observer* tongshi1=new StockObserver("魏关姹",huhansan); Observer* tongshi2=new StockObserver("易管察",huhansan); Observer* tongshi3=new NBAObserver("霍华德",huhansan); Observer* tongshi4=new NBAObserver("林书豪",huhansan); //将4个观察者都加入到通知者的通知队列中 huhansan->Attach(tongshi1); huhansan->Attach(tongshi2); huhansan->Attach(tongshi3); huhansan->Attach(tongshi4); //魏关姹没有被老板通知到,减去。 huhansan->Detach(tongshi1); huhansan->SetSubjectState("我胡汉三回来了!"); //通知 huhansan->Notify(); delete huhansan; delete tongshi1; delete tongshi2; delete tongshi3; delete tongshi4; std::cout<<""<
          
           

(6)运行截图