1. 程式人生 > >設計模式實現——觀察者模式

設計模式實現——觀察者模式

觀察者模式簡介

又稱釋出——訂閱模式,主要用於類物件之間訊息通知。當主要物件發生資訊變更後,與之相關聯的資訊也應該變更顯示。

主要的操作:

1、先建立主體subject;

2、建立觀察者,同時告訴它要關注的主體subuject。

3、主體subject要知道哪些人關注了它,因此需要維護一個list。同時將觀察者放入list中。操作位Attach()。如果不關注了需要Detach()。

4、觀察者要主動拉取資訊,pull()。

這個類圖比較簡單,但實現比較麻煩。實現需要注意:

1、同一個觀察者不要attach兩次或兩次以上。(除非你希望給同一個觀察者傳送多次重複的資訊,但沒多少意義)

2、如果一個例項提前消亡了,在消亡前應該Detach掉,否者下次傳送訊息將導致不可預知的風險。(當然每次傳送訊息的時候,可以對每一個例項是否存在檢查)

3、其他的還沒有遇到。

類圖


程式碼

subject程式碼部分

#pragma  once
#include "Observer.h"
#include <string>
#include <iostream>
#include <list>
using namespace std;

class ConcreteSubject{
public:
	ConcreteSubject();
	virtual void  Attach(Observer* ob);
	virtual void  Dettch(Observer* ob);
	virtual void  NotifyAll();
	virtual void changeState(std::string _state);
	virtual std::string getState();
	~ConcreteSubject();
protected:
	std::string state;
	std::list<Observer *> _obList;
};
#include "ConcreteSubject.h"
ConcreteSubject::ConcreteSubject():state("one"){
}

void ConcreteSubject::Attach(Observer* ob){
	std::cout<<"Insert Observer:"<<ob->getObserverId()<<std::endl;
	std::list<Observer *>::iterator it;
	for(it=_obList.begin();it!=_obList.end();it++)
		if((*it)==ob){
			std::cout<<" has been in the List"<<std::endl;
			return;
		}
	_obList.push_back(ob);
}

void ConcreteSubject::Dettch(Observer* ob){
	std::cout<<"Observer "<<ob->getObserverId()<<" : ";
	 _obList.remove(ob);
	 std::cout<<"removed";
}

void ConcreteSubject::NotifyAll(){
	std::list<Observer *>::iterator it;
	for(it = _obList.begin();it!=_obList.end();it++)
	{
		(*it)->pull();
	}
}

void ConcreteSubject::changeState(std::string _state){
	state = _state;
}

std::string ConcreteSubject::getState(){
	return state;
}

ConcreteSubject::~ConcreteSubject(){
	std::cout<<"ConcreteSubject "<<std::endl;
}

觀察者部分

#pragma once
#include "ConcreteSubject.h"
#include <string>
#include <iostream>

class ConcreteObserver:
	public Observer{
protected:
	ConcreteObserver(void);
public:
	ConcreteObserver(ConcreteSubject* _sub,int id);
	virtual void pull();
	virtual int getObserverId();
	~ConcreteObserver();
private:
	ConcreteSubject* subject;
	int Id;
};
#include "ConcreteObserver.h"

ConcreteObserver::ConcreteObserver(){
}

ConcreteObserver::ConcreteObserver(ConcreteSubject* _sub,int id):subject(_sub),Id(id){
}

void ConcreteObserver::pull(){
	std::cout <<"Observer "<<Id<<": "<< subject->getState() <<std::endl;
}

int ConcreteObserver::getObserverId(){
	return Id;
}

ConcreteObserver::~ConcreteObserver(){
	std::cout<<" ~ConcreteObserver :"<<Id<<std::endl;
}



相關推薦

設計模式實現——觀察模式

觀察者模式簡介 又稱釋出——訂閱模式,主要用於類物件之間訊息通知。當主要物件發生資訊變更後,與之相關聯的資訊也應該變更顯示。 主要的操作: 1、先建立主體subject; 2、建立觀察者,同時告訴它要關注的主體subuject。 3、主體subject要知道哪些人關注了它

大話設計模式觀察模式總結-java實現

注:示例來自《大話設計模式》 現有如下需求 公司員工想要利用工作時間炒股票 老闆經常外出 怕被老闆看到 於是拜託前臺小姐姐 老闆回來的時候打個電話通知他們 初步程式碼實現如下 前臺祕書類 package Test14; import java.uti

設計模式觀察模式(Python實現

下面介紹在學習《深入淺出設計模式》中的第二個設計模式:觀察者模式 先定義一下觀察者模式:觀察者模式定義了物件之間的一對多依賴,這樣當一個物件改變狀態時,它的所有物件都會收到依賴並且自動更新。 具體的示例請看下圖: 觀察者模式在實際應用中被使用的相當廣泛。這種設計模式體現了

設計模式觀察模式(Observer Pattern、JDK實現

import java.util.Observable; import java.util.Observer; /** * 觀察者模式(JDK實現)。 * @author Bright Lee */ public class JdkObserverPattern { public st

設計模式觀察模式——利用java中提供的觀察實現

java實現與自己實現的對比 一、不需要再定義觀察者和目標的介面了,JDK幫忙定義了 二、具體的目標實現裡面不需要再維護觀察者的註冊資訊了,這在Java中的Observable類裡面已經幫忙實現好了。 三、觸發通知的方式有一點變化,要先呼叫setChanged方

Java設計模式觀察模式的兩種實現

     觀察者模式就是定義物件之間的一對多依賴,這樣一來,當一個物件狀態發生改變時,它的所有依賴者都會收到通知並自動更新。  這樣的好處就是兩個或多個物件之間鬆耦合,它們依然可以互動,但不太清楚彼此的細節。觀察者模式提供了一種物件的設計,讓主題和觀察者之間鬆耦合。鬆耦合的設

設計模式】使用unity實現觀察模式(delegate,event)

最近開發的時候,發現要用到設計模式中的觀察者模式,所以就找了一些資料來看看,然後自己結合Unity來實現了一下觀察者模式, 由於本人是初學者,寫的不好,望請指導。 首先,擺好如圖所示的UI的介面: 然後建立如下的指令碼: 1、Subject(這個指令碼是事件的派發類,

微信發個朋友圈沒有想到也可以用設計模式實現——觀察模式

觀察者模式的概念         觀察者模式(Observer Pattern):定義物件之間的一種一對多依賴關係,使得每當一個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。觀察者模式的別名包括髮布-訂閱(Publish/Subscribe)模式、模型-檢視(M

HeadFirst設計模式觀察模式(C++實現

觀察則模式 1. 面向物件原則 封裝變化:找到應用中可能變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。 把會變化的部分取出並封裝起來,以便以後可以輕易地改動或擴充此部分,而不影響不需要變化的其他部分。 針對介面(Interface)

23種設計模式 之 Observer模式觀察模式)[C語言實現]

一、概念定義 Observer模式又稱為釋出-訂閱模式。 Observer模式:定義了一種一對多的依賴關係,讓多個觀察者(Observer)同時監聽某一主題物件(Subject)。當這個主題物件(Subject)的狀態發生變化時,會通知觀察者物件(Observer),

【一起學設計模式觀察模式實戰:真實專案中屢試不爽的瓜娃EventBus到底如何實現觀察模式的?

申明 本文章首發自本人公眾號:壹枝花算不算浪漫,如若轉載請標明來源! 感興趣的小夥伴可關注個人公眾號:壹枝花算不算浪漫 22.jpg 前言 之前出過一個設計模式的系列文章,這些文章和其他講設計模式的文章 有些不同 文章沒有拘泥於講解設計模式的原理,更多的是梳理工作中實際用到的一些設計模式,並提取出對應業務模

大話設計模式觀察模式

arm eve his watermark observer cts 多個 放下 們的 從前,有個放羊娃。每天都去山上放羊,一天,他認為十分無聊。就想了個捉弄大家尋開心的主意。他向著山下正在種田的農夫們大聲喊:“狼來了!狼來了!救命啊!”農夫們聽到喊聲

設計模式觀察模式

觀察者模式 observer 監聽器的底層實現 observable 群發消息 轉發機制 1、觀察者模式的簡單介紹: a、核心: - 觀察者模式主要用於 1 : N 的通知中。當一個對象(目標對象 Subject 或者 Objservable )的狀態變化時,他需要及時告知

PHP模式設計之單例模式、工廠模式、註冊樹模式、適配器模式觀察模式

操作符 unset 關系 玩具 ati ase color 只有一個 bsp php模式設計之單例模式   什麽是單例模式?   單例模式是指在整個應用中只有一個實例對象的設計模式   為什麽要用單例模式?   php經常要鏈接數據庫,如果在一個項目中頻繁建立連接數據庫,會

Java設計模式補充:回調模式、事件監聽器模式觀察模式(轉)

應該 hand 關閉 lan china 關註 update 使用 event 一、回調函數 為什麽首先會講回調函數呢?因為這個是理解監聽器、觀察者模式的關鍵。 什麽是回調函數 所謂的回調,用於回調的函數。 回調函數只是一個功能片段,由用戶按照回調函數調用約定來實現的

設計模式觀察模式詳解

http 通知 stat 發布-訂閱 () class arraylist nag .cn 觀察者模式又稱為發布-訂閱模式,涉及的角色有:   ●  抽象主題   ●  具體主題   ●  抽象觀察者   ●  具體觀察者 案例演示:公司發放工資的時候通知所有觀察者工資已發

設計模式觀察模式

new mes 一對多 建議 ios between 生存 兩個 開始 1、定義 1.1 標準定義 觀察者模式(Observer Pattern)也叫做發布訂閱模式(Publish/subscribe),它是一個在項目中經常使用的模式,其定義如下:Define a one-

23種設計模式觀察模式

主題 一個 server bsp 監聽 images 關系 .com 自動更新 觀察者模式(Observer):定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。 23種設計模式之

使用util包裏自帶的接口和類實現觀察模式

註意 簡化 響應 cat pan hang sys ext main 之前的關於觀察者模式的文章,是用自己寫的Observable接口和Observer接口,然後進行實現。其實官方的util包下自帶有實現觀察者模式對應的接口和類,可以簡化我們的代碼結構。 比如我們可

設計模式4(代理模式觀察模式

代理 bject body border 策略 解決 設計模式 server 觀察者 代理模式 本質是控制對主題對象的訪問 功能 目的 代理模式 但是代理對象則提供與目標對象相同的接口 控制對象的訪問 適配器模式 解決接口