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++ 设计模式(可复用面向对象软件的基础)学习笔记——第五讲 观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Security 初体验
- 下一篇: 电子面单api接口_JAVA调用示例