C 設計模式 Observer觀察者模式

2021-07-06 10:32:16 字數 3009 閱讀 5251

observer觀察者模式

作用:觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件,這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己

uml圖:

subject類,可翻譯為主題或抽象通知者,一般用乙個抽象類或者乙個藉口實現。它把所有對觀察者物件的引用儲存在乙個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供乙個藉口,可以增加和刪除觀察者物件。

observer類,抽象觀察者,為所有的具體觀察者定義乙個藉口,在得到主題的通知時更新自己。這個藉口叫做更新介面。抽象觀察者一般用乙個抽象類或者乙個介面實現。更新介面通常包含乙個update()方法。

concretesubject類,叫做具體主題或具體通知者,將有關狀態存入具體通知者物件;在具體主題的內部狀態改變時,給所有等級過的觀察者發出通知。通常用乙個具體子類實現。

concreteobserver類,具體觀察者,實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題的狀態相協調。具體觀察者角色可以儲存乙個指向乙個具體主題物件的引用。

特點:將乙個系統分割成一系列相互協作的類有乙個很不好的***,那就是需要維護相關物件間的一致性。我們不希望為了維持一致性而使各類緊密耦合,這樣會給維護、擴充套件和重用都帶來不便。

何時使用:

當乙個物件的改變需要同時改變其他物件的時候,而且它不知道具體有多少物件有待改變時,應該考慮使用觀察者模式。

觀察者模式所做的工作其實就是在解除耦合。讓耦合的雙方都依賴於抽象,而不是依賴於具體。從而使得各自的變化都不會影響另一邊的變化。

**如下:

observer.h

1

#ifndef _observer_h_

2#define _observer_h_

34 #include

5 #include 6

using

namespace

std;78

class

subject;910

class

observer11;

1920

class concreteobservera : public

observer21;

3031

class concreteobserverb : public

observer32;

4142

class

subject43;

5758

class concretesubjecta : public

subject59;

6667

class concretesubjectb : public

subject68;

7576

#endif

observer.cpp

1 #include "

observer.h

"2 #include 3 #include 4

5using

namespace

std;67

observer::observer()8{}

910 observer::~observer()

11{}

1213

concreteobservera::concreteobservera()

14{}

1516 concreteobservera::~concreteobservera()

17{}

1819

void concreteobservera::update(subject*psubject)

2024

25concreteobserverb::concreteobserverb()

26{}

2728 concreteobserverb::~concreteobserverb()

29{}

3031

void concreteobserverb::update(subject*psubject)

3236

37subject::subject()

38{}

3940 subject::~subject()

41{}

4243

void subject::attach(observer*pobserver)

4448

49void subject::detach(observer*pobserver)

5057 cout << "

detach an observer\n";

58}5960

void

subject::notify()

6167}68

69string

subject::getstate()

7073

74void subject::setstate(string

state)

7578

79concretesubjecta::concretesubjecta()

80{}

8182 concretesubjecta::~concretesubjecta()

83{}

8485

concretesubjectb::concretesubjectb()

86{}

8788 concretesubjectb::~concretesubjectb()

89 {}

main.cpp

#include "

observer.h

"#include

using

namespace

std;

intmain()

結果如下:

C 設計模式 Observer觀察者模式

observer觀察者模式 作用 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件,這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己 uml圖 subject類,可翻譯為主題或抽象通知者,一般用乙個抽象類或者乙個藉口實現。它把所有對觀察者物件的引...

C 設計模式 觀察者模式 Observer

觀察者模式,定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。以下任一情況下可以使用觀察者模式 來看下 isubject.h include include class iobserver using namespace std 抽象目標 cla...

C 設計模式 觀察者(Observer)

定義物件間的一種一對多的依賴關係,當目標發生變化時,它的所有觀察者得到通知並自動更新。主要組成 subject 目標 concretesubject 具體目標 observer 觀察者 concreteobserver 具體觀察者 using system using system.collecti...