日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 设计模式(可复用面向对象软件的基础)学习笔记——第五讲 观察者模式

發布時間:2024/3/24 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 设计模式(可复用面向对象软件的基础)学习笔记——第五讲 观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

對于設計模式初學者來說,GoF的這本設計模式(可復用面向對象軟件的基礎)是有些難理解的,因此我先看了視頻教程,附上教程鏈接網址https://www.bilibili.com/video/av52251106/?p=5。

???????以下是我的學習筆記整理,分享給有需要的朋友,記錄的比較簡單,如有不理解的地方可以看原教程視頻鏈接,或者留言給我,本小菜和你一起探討。

一、“組件協作”模式

1.現代?軟件專業分工之后的第一個結果是“框架與應用程序的劃分”,“組件協作”模式通過晚期綁定,來實現框架與應用程序之間的松耦合,是二者之間協作時常用的模式。

2.典型模式

?? ?Template?Method

? ? Strategy

? ? Observer/Event? ? ? ? ? ? ? ? ? ??

二、動機(Motivation)

1.在軟件構建過程中,我們需要為某些對象建立一種“通知依賴關系”——一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知。如果這樣的依賴關系過于緊密,將使軟件不能很好的抵御變化。

2.使用面向對象技術,可以將這種依賴關系弱化,并形成一種穩定的依賴關系。從而實現軟件體系結構的松耦合。

三、代碼實例

FileSplitter.cpp:

class Iprogress{

public:

?? ?? ? virtual void DoProgress(float value) = 0;

?? ?? ? virtual ~IProgress(){}

};

?

class FileSplitter

{

?? ?? ? string m_filePath;

? ? ?? ?int m_fileNumber;

?

?? ?? ?list<ProgressBar*> m_iprogressList;//抽象通知機制

public:

? ? ?? ?FIleSplitter(const string& filePath,int fileNumber):

?? ??? ??? ??? ?m_filePath(filePath),

?? ??? ??? ?? ? m_fileNumber(fileNumber){

?? ??? ?}

?

?? ?? ? void addIProgress(Iprogress*){

?? ??? ??? ??? ?m_iprogressList.add(Iprogress);

?? ?? ? }

?

?? ??? ?void removeIProgress(Iprogress*){

?? ??? ??? ??? ?m_iprogressList.remove(Iprogress);

?? ?? ? }

?

?? ?? ? void split(){

?? ??? ??? ?? ? //1.讀取大文件

?? ??? ??? ??? ?

?? ??? ??? ?? ? //2.分批次向小文件中寫入

?? ??? ??? ?? ? for(int i = 0; i < m_fileNumber; i++){

?? ??? ??? ??? ??? ?? ? //...

?? ??? ??? ??? ??? ?? ? float progressValue = m_fileNumber;

?? ??? ??? ??? ??? ?? ? progressValue = (i+1)/progressValue;

?? ??? ??? ??? ??? ?? ? OnProgress(progressValue);

?? ??? ??? ?? ? }

?? ?? ? }

protected:

? ? ? ? virtual?void OnProgress(float value){

?? ??? ??? ?? ? List<IProgress*>::Iterator itor = m_iprogressList.begin();

?? ?? ??? ? ?? ?while(itor != m_iprogressList.end()){

?? ??? ??? ??? ??? ?? ? (*itor)->DoProgress(value);//更新進度

?? ??? ??? ??? ??? ?? ? itor++;

?? ??? ??? ?? ? }

? ? ?? ?}

};

?

MainForm.cpp:

注意:c++不推薦多繼承,除非一個父類是主流程,其他都是接口類。

class MainForm : public Form, public Iprogress

{

?? ?? ? TextBox* txtFilePath;

?? ?? ? TextBox* txtFileNumber;

?

?? ?? ? ProgressBar* progressBar;

public:

?? ?? ? void Button1_Click(){

?? ??? ??? ?? ? string filePath = txtFilePath->getText();

?? ??? ??? ?? ? int number = atoi(txtfileNumber->getText().c_str());

?? ??? ??? ?

?? ??? ??? ?? ? ConsoleNotifier cn;

?

?? ??? ??? ?? ? FileSplitter splitter(filePath,number);

?

?? ??? ??? ?? ? splitter.addIProgress(this);//訂閱通知

?? ??? ??? ??? ?splitter.addIProgress(&cn);//訂閱通知

?

?? ??? ??? ??? ?splitter.split();

?? ?? ? }

?? ??? ?

?? ?? ? virtual void DoProgress(float value){

?? ?? ???? ?? ? progressBar->setValue(value);

?? ??? ?}

};

?

class consoleNotifier : public Iprogress{

public:

?? ?? ? virtual void DoProgress(float value){

?? ??? ??? ?? ? cout <<".";

?? ?? ? }

}

?

四、模式定義

?

定義對象間的一種一對多(變化)的依賴關系,以便當一個對象(Subject)的狀態發生改變時,所有依賴于它的對象都得到通知并自動更新。

?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? ——《設計模式》GoF

?

五、要點總結

1.使用面向對象的抽象,observer模式使得我們可以獨立地改變目標與觀察者,從而使二者之間的依賴關系達至松耦合。

2.目標發送通知時,無需指定觀察者,通知(可以攜帶通知信息作為參數)會自動傳播。

3.觀察者自己決定是否需要訂閱通知,目標對象對此一無所知。

4.Observer模式是基于事件的UI框架中非常常用的設計模式,也是MVC模式的一個重要組成部分。

六、最簡偽代碼

//IDo類是觀察者需要執行功能的基類

class IDo{

public:

? ? ? ?virtual dothing()=0;

? ? ? virtual ~IDo();

};

//IDo1觀察者需要通知執行功能的實現子類1

class IDo1 : public IDo{

public:

? ? ? ?virtual dothing(){

? ? ? ?實現1功能;

? ? ? ?}

};

//IDo2觀察者需要通知執行功能的實現子類2

class IDo2 : public IDo{

public:

? ? ? ?virtual dothing(){

? ? ? ?實現2功能;

? ? ? ?}

};

//觀察者通知列表類

class NotifyList{

List<IDo*> m_alist;

public:

? ? ? ?void addN(IDo* do){

? ? ? ? ? ? ? m_alist.add(do);

? ? ? ?}

? ? ? void removeN(IDo* do){

? ? ? ? ? ? ? m_alist.remove(do);

? ? ? }

? ? ? void fun(){

? ? ? ? ? ? ?onDo();

? ? ? }

protected:

? ? ?void onDo(){

? ? ? ? ? ? void* itor =?m_alist.begin();

? ? ? ? ? ? while(itor!= m_alist.end()){

? ? ? ? ? ? ? ? ? ? (*itor)->dothing();

? ? ? ? ? ? ? ? ? ? itor++;

? ? ? ? ? }

? ? ?};

//業務通知類,根據具體情況添加需要通知的業務。

//唯一一個后續需要根據業務更改的類

class notify{

? ? ? ? NotifyList m_nl;

public:

? ? ? ? ?void event1(){

? ? ? ? ? ? ? ?IDo1 do1;

? ? ? ? ? ? ? ?m_nl.addN(do1);

? ? ? ? ? ? ? ?IDo2 do2;

? ? ? ? ? ? ? ??m_nl.addN(do2);

? ? ? ? ?}

? ? ? ? ?void funN(){

? ? ? ? ? ? ? ? ?m_nl.fun();

? ? ? ? ? }

}

總結

以上是生活随笔為你收集整理的C++ 设计模式(可复用面向对象软件的基础)学习笔记——第五讲 观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。