設計模式實現——觀察者模式
觀察者模式簡介
又稱釋出——訂閱模式,主要用於類物件之間訊息通知。當主要物件發生資訊變更後,與之相關聯的資訊也應該變更顯示。
主要的操作:
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 觀察者 代理模式 本質是控制對主題對象的訪問 功能 目的 代理模式 但是代理對象則提供與目標對象相同的接口 控制對象的訪問 適配器模式 解決接口