1. 程式人生 > >設計模式——觀察者模式(C++)

設計模式——觀察者模式(C++)

上車了不說了,就直接放程式碼了哈,有問題可留言。

抽象觀察者類、具體觀察者類定義:

/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:observer.h
@datetime:2016.09.10
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#ifndef _OBSERVER_H
#define _OBSERVER_H

#include <string>
#include"subject.h"

class Subject;

// 抽象觀察者,為所有具體觀察者定義一個更新介面,當得到主題的通知時,更新自己。
class Observer {
public:
    Observer();
    ~Observer();
    virtual void update(Subject* sub) = 0;  // 純虛擬函式,只定義介面,並不實現,不能例項化物件。
};

// 具體觀察者,實現抽象觀察者的更新介面,以便使本身狀態與主題狀態相協調。
class ConcreteObserverA : public Observer {
private:
    std::string state;
public:
    ConcreteObserverA();
    ~ConcreteObserverA();
    // 派生類定義虛擬函式,覆蓋基類純虛擬函式。
    virtual void update(Subject* sub);      // 引數為抽象主題,這樣做減少了觀察者與具體主題的耦合。
};

// 具體觀察者,實現抽象觀察者的更新介面,以便使本身狀態與主題狀態相協調。
class ConcreteObserverB : public Observer {
private:
    std::string state;
public:
    ConcreteObserverB();
    ~ConcreteObserverB();
    // 派生類定義虛擬函式,覆蓋基類純虛擬函式。
    virtual void update(Subject* sub);      // 引數為抽象主題,這樣做減少了觀察者與具體主題的耦合。
};

#endif // _OBSERVER_H
抽象觀察者類、具體觀察者類實現:
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:observer.cpp
@datetime:2016.09.10
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include "observer.h"
#include <iostream>

using namespace std;

Observer::Observer() {

}

Observer::~Observer() {

}

ConcreteObserverA::ConcreteObserverA() {

}

ConcreteObserverA::~ConcreteObserverA() {

}

// 觀察者更新自己的一系列動作
void ConcreteObserverA::update(Subject* sub) {
    state = sub->getState();
    cout << "ConcreteObserverA 收到 " + state << endl;
    // ...
}

ConcreteObserverB::ConcreteObserverB() {

}

ConcreteObserverB::~ConcreteObserverB() {

}

// 觀察者更新自己的一系列動作
void ConcreteObserverB::update(Subject* sub) {
    state = sub->getState();
    cout << "ConcreteObserverB 收到 " + state << endl;
    // ...
}
抽象主題類、具體主題類定義:
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:subject.h
@datetime:2016.09.10
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#ifndef _SUBJECT_H
#define _SUBJECT_H

#include <iostream>
#include <string>
#include <list>

#include "observer.h"
class Observer;

// 抽象主題,將所有觀察者儲存在一個聚集中,可以有任何數量的觀察者,並且提供一個介面,可以刪除和增加觀察者。
class Subject {
private:
    std::string state;
    std::list<Observer*> lst;
public:
    Subject();
    ~Subject();

    virtual void attach(Observer* obj);     // 引數為抽象觀察者類,這樣做減少了主題與具體觀察者類的耦合。
    virtual void detach(Observer* obj);
    virtual void notify();

    virtual void setState(std::string state);
    virtual std::string getState();
};

// 具體主題,當具體主題內部發生變化時,給所有登記過的觀察者傳送通知。
class ConcreteSubjectA : public Subject {
public:
    ConcreteSubjectA();
    ~ConcreteSubjectA();
};

// 具體主題,當具體主題內部發生變化時,給所有登記過的觀察者傳送通知。
class ConcreteSubjectB : public Subject {
public:
    ConcreteSubjectB();
    ~ConcreteSubjectB();
};

#endif // _SUBJECT_H
抽象主題類、具體主題類實現:
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:subject.cpp
@datetime:2016.09.10
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include "subject.h"
#include <iostream>

using namespace std;

Subject::Subject() {

}

Subject::~Subject() {

}

void Subject::attach(Observer* obj) {
    lst.push_back(obj);
}

void Subject::detach(Observer* obj) {
    list<Observer*>::iterator it = find(lst.begin(), lst.end(), obj);
    if ( it != lst.end() ) {
        lst.erase(it);
    }
    cout << "Detach an Observer." << endl;
}

void Subject::notify() {
    list<Observer*>::iterator it = lst.begin();
    for (; it != lst.end(); it++) {
        (*it)->update(this);
    }
}

void Subject::setState(string state) {
    this->state = state;
}

string Subject::getState() {
    return state;
}

ConcreteSubjectA::ConcreteSubjectA() {

}

ConcreteSubjectA::~ConcreteSubjectA() {

}

ConcreteSubjectB::ConcreteSubjectB() {

}

ConcreteSubjectB::~ConcreteSubjectB() {

}
主函式入口:
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:main.cpp
@datetime:2016.09.10
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include <iostream>
#include "observer.h"
#include "subject.h"

using namespace std;

// 1.主題與觀察者都在抽象層進行依賴,而不涉及具體層(即:具體主題與具體觀察者的關聯),這樣降低了耦合程度。
// 2.由1知,主題發出通知時,並不需要知道它的觀察者是誰,且觀察者之間都不知道對方的存在(觀察者之間是獨立的)。
int main() {
    Observer* p1 = new ConcreteObserverA();         // 例項化 具體觀察者A
    Observer* p2 = new ConcreteObserverB();         // 例項化 具體觀察者B

    Subject* sub1 = new ConcreteSubjectA();         // 例項化 具體主題A
    sub1->attach(p1);                               // 觀察者A 登記
    sub1->attach(p2);                               // 觀察者B 登記

    sub1->setState("online");                       // 主題A狀態發生變化

    sub1->notify();                                 // 通知登記過的觀察者

    Subject* sub2 = new ConcreteSubjectB();         // 例項化 具體主題B
    sub2->attach(p1);                               // 觀察者A 登記
    sub2->attach(p2);                               // 觀察者B 登記

    sub2->setState("offline");                      // 主題B狀態發生變化

    sub2->notify();                                 // 通知登記過的觀察者

    system("pause");
    return 0;
}
就這樣。

相關推薦

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

ace mes des ret rtu cto pattern virt date 1 #include <iostream> 2 #include <vector> 3 #include <algorithm>

C#設計模式--觀察模式發布-訂閱模式

工廠方法 設計 解決 line strac itl names spa ret 0.C#設計模式--簡單工廠模式 1.C#設計模式--工廠方法模式 2.C#設計模式--抽象工廠模式 3.C#設計模式--單例模式 4.C#設計模式--建造者模式 5.C#設計模式--

設計模式——觀察模式C++

上車了不說了,就直接放程式碼了哈,有問題可留言。 抽象觀察者類、具體觀察者類定義: /***************************************** Copyright (c)

設計模式中的黃金搭檔一對活寶:命令模式+觀察模式

現有場景描述:現在無論是系統自帶的鍵盤還是第三方的鍵盤一般都自帶撤銷和恢復功能,你知道它們是用的什麼模式實現的嗎?它們用的是==命令模式+觀察者模式==,你答對了嗎?簡單科普一下啥是==Command模式==? Command模式:- 模式型別:行為類模式- 定義:將一個操作、一個方法呼叫、一個命令封裝成一個

設計模式-觀察模式Observer

觀察者模式是行為模式的一種,它的作用是當一個物件的狀態發生變化時,能夠自動通知關聯物件,自動重新整理物件狀態。 觀察者模式提供給關聯物件一種同步通訊的手段,使某個物件與依賴它的其他物件之間保持狀態同步。 角色和職責: 1.被觀察者(Observable)-:    被觀察者物件,當

Java 設計模式——觀察模式Observer Pattern

    前言 一、簡介 二、實現步驟 (1)實現方式: (2)舉例: (3)步驟簡化版: 三、程式碼實現 四、總結 五、Demo地址 六、參考文件 七、內容推薦 前言 本來沒想寫前言的,感覺就是一堆廢話。那就當

設計模式--觀察模式

1.unity 目錄結構如下: 2. canvas 下掛如下四個指令碼 Subject.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using

設計模式——觀察模式bserver

引言 為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面是的這一子系統更加容易使用 結構圖 角色 外觀(Façade)角色 客戶端呼叫這個角色的方法。該角色知道相關的一

Java設計模式——觀察模式Observer Pattern

場景一 描述:《孫子兵法》有云:“知彼知己,百戰不殆;不知彼而知己,一勝一負;不 知彼,不知己,每戰必殆”,那怎麼才能知己知彼呢?知己是很容易的,自己的軍隊嘛,很容易知道,那怎麼知彼呢?安插間諜是很

【一起學設計模式】中介模式+觀察模式+備忘錄模式實戰:提交個訂單我到底經歷了什麼鬼?

前言 再多的話就不說了,這個是接著上一講: 【一起學設計模式】狀態模式+裝飾器模式+簡單工廠模式實戰:(一)提交個訂單我到底經歷了什麼鬼? 一起的,一些多餘的贅述請先看這個篇文章。 業務場景 一圖流,還是上一篇文章中一樣的圖,接下來我們就梳理下總結模式、觀察者模式、備忘錄模式的應用: 訂單中心: 1、訂單

c#設計模式-觀察模式

正在 pro 描述 設計 abstract logs 名單 ron alt Observer 與 Subject 互為耦合,但是這種耦合的雙方都依賴於抽象,而不依賴於具體。 一、觀察者模式 目的 概述 原理 二、 C#中的觀察者模式 概述 模型與觀察者基類 優點 三、

C#設計模式-觀察模式與事件的一點小小心得

由於經驗和能力有限,設計模式這種高大上的東西要研究下來,不知道要禿了多少根頭髮,作為一個初學者,也只能簡單的理解一下大概思路 最近剛好在惡補基礎,看到了事件event  看大佬的部落格和資料一大串,幾百行 還沒看已經暈掉了 只能先簡化一下,說一下自己的理解 事件 Event 

C++程式設計思想 第2卷 第10章 設計模式 觀察模式

觀察者 Observer 模式用於解決一個常見的問題 當其他物件改變狀態時 如果一組物件需要進行相應的更新 那麼應該如何處理呢? 使用兩種物件的型別以實現觀察者模式 //: C10:Observer.h // From "Thinking in C++, Volume 2

C++設計模式--觀察模式

觀察者模式定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新。                                              

c++設計模式----觀察模式

設計模式是軟體工程的基石脈絡,如同大廈 的結構一樣。設計模式的分類,可分為建立型模式,結構性模式,行為型模式。 1 建立型模式:通常和物件的建立有關,涉及到物件的例項化方式。大概有五種模式 工廠方法模式 定義一個建立產品物件的工廠介面,將實際建立工作推遲

設計模式初探 行為模式 觀察模式 c語言 版本實現

上午簡單的學習了觀察者模式,首先想到的是群郵件和微博加粉絲。於是寫了個鳳姐與粉絲的小程式。 我對設計模式是初次學習,理解可能並不準確,只能按照自己的理解去用程式模擬設計模式,希望理解的與其真正含義不要相差太遠為好。 /**設計模式 行為模式 觀察者模式 鳳姐與粉絲 *

C#設計模式---觀察模式簡單例子

在開發過程中經常遇到一個模組中的 一個方法呼叫了其他模組中相關的方法 比如說在一個系統中,如果出現了錯誤,就呼叫專門進行錯誤處理的模組中的方法進行錯誤處理 而因為錯誤處理的操作有很多,所以將這些具體的操作封裝在其他的模組中 在專門進行錯誤處理的模組中呼叫其他模組中的錯誤操作

C#設計模式-觀察模式

一.基本簡介:觀察者設計模式定義了物件間的一種一對多的依賴關係,以便一個物件的狀態發生變化時,所有依賴於它的物件都得到通知並自動重新整理。在現實生活中的可見觀察者模式,例如,微信中的訂閱號,訂閱部落格和QQ微博中關注好友,這些都屬於觀察者模式的應用。 二.實現:比如熱水器在

設計模式觀察模式

5.1 servers 監聽 val notify src [] ati 場景 1 定義   觀察者模式,有時又稱為發布-訂閱模式。定義了一種一對多個依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己

三國設計模式——觀察模式

efault bre ati fault println bst imp default mman 1 package observer; 2 3 public abstract class ObserverGenerals { 4 5 protect