Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 觀察者模式可能是我們在軟體開發中使用得比較多的一種設計模式。為什麼這麼說?大家可以聽我一一到來。我們知道,在windows的軟體中,所有的界都是由視窗構成的。對話方塊是視窗,菜單是視窗,工具列也是視窗。那麼這些視窗,在很多情況下要對一些共有的資訊進行處理。比如說,視窗的放大,視窗的減小等等。面對這一情況,觀察者模式就是不錯的一個選擇。
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 備忘錄模式的起源來自於撤銷的基本操作。有過word軟體操作經驗的朋友,應該基本上都使用過撤銷的功能。舉個例子,假設你不小心刪除了好幾個段落的文字,這時候你應該怎麼辦呢?其實要做的很簡單,單擊一些【撤銷】就可以全部搞定了。撤銷按鈕給我們提供了一次反悔的機會。 既然是撤銷,那麼我們在進行某種動作的時候,就應該建立一個相應的撤銷操作?這個撤銷操作的相關定義可以是這樣的。typedef
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 解譯器模式雖然聽上去有些費解,但是如果用樣本說明一下就不難理解了。我們知道在C語言中,關於變數的定義是這樣的:一個不以數字開始的由字母、數字和底線構成的字串。這種形式的運算式可以用狀態自動機解決,當然也可以用解譯器的方式解決。typedef struct _Interpret{ int type; void* (*process)(void* pData, int*
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 命令模式的目的主要是為了把命令者和執行者分開。老規矩,舉個範例吧。假設李老闆是一家公司的頭兒,他現在讓他的秘書王小姐去送一封信。王小姐當然不會自己親自把信送到目的地,她會把信交給郵局來完成整個投遞的全過程。現在,我們就對投遞者、命令、發令者分別作出定義。 首先定義post的相關資料。typedef struct _Post{ void (*do)(struct _Post*
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 狀態模式是協議互動中使用得比較多的模式。比如說,在不同的協議中,都會存在啟動、保持、中止等基本狀態。那麼怎麼靈活地轉變這些狀態就是我們需要考慮的事情。假設現在有一個state,typedef struct _State{ void (*process)(); struct _State* (*change_state)();}State;
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 策略模式就是用統一的方法介面分別對不同類型的資料進行訪問。比如說,現在我們想用pc看一部電影,此時應該怎麼做呢?看電影嘛,當然需要各種播放電影的方法。rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。可是事實上,我們完全可以不去管是什麼檔案格式。因為播放器對所有的操作進行了抽象,不同的檔案會自動調用相應的存取方法。typedef struct
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 裝飾模式是比較好玩,也比較有意義。其實就我個人看來,它和責任鏈還是蠻像的。只不過一個是比較判斷,一個是迭代處理。裝飾模式就是那種迭代處理的模式,關鍵在哪呢?我們可以看看資料結構。typedef struct _Object{ struct _Object* prev; void (*decorate)(struct _Object* pObject);}Object;
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 中介者模式,聽上去有一點陌生。但是,只要我給朋友們打個比方就明白了。早先自由戀愛沒有現在那麼普遍的時候,男女之間的相識還是需要通過媒婆之間才能相互認識。男孩對女方有什麼要求,可以通過媒婆向女方提出來;當然,女方有什麼要求也可以通過媒婆向男方提出來。所以,中介者模式在我看來,就是媒婆模式。typedef struct _Mediator{ People* man;
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 現在的生活當中,我們離不開各種電子工具。什麼膝上型電腦、手機、mp4啊,都離不開充電。既然是充電,那麼就需要用到充電器。其實從根本上來說,充電器就是一個個普通的適配器。什麼叫適配器呢,就是把220v、50hz的交流電壓編程5~12v的直流電壓。充電器就幹了這麼一件事情。 那麼,這樣的一個充電適配器,我們應該怎麼用c++描述呢? class
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 虛函數是物件導向設計中的一個重要內容。它的出現使得我們只需要相同的介面函數,並可以得到不同的產生結果。但是有些朋友卻知其然,不知其所以然,為什麼會出現這樣的結果,我們可以用一段代碼說明問題。首先,我們先定義兩個基本類型,一個是employee,一個是manager,看過前面一片部落格的朋友應該都有點印象:class employee{public:employee() {
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 看過設計模式的朋友都知道,我們在設計單件模式的時候離不開類的靜態函數。和類的成員變數不同,類的靜態變數屬於全部類對象資料;同樣和類的成員函數不同,類的靜態函數屬於全部類函數共有。這句話讀來想來有一些拗口,不過沒有關係,我們可以通過一段代碼來說明問題。 (1)靜態變數 老規矩,我們首先對類進行初步定義,如下所示:class employee{public:employee()
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 不知不覺當中,我們就到了最後一種設計模式,即訪問者模式。訪問者模式,聽上去複雜一些。但是,這種模式用簡單的一句話說,就是不同的人對不同的事物有不同的感覺。比如說吧,豆腐可以做成麻辣豆腐,也可以做成臭豆腐。可是,不同的地方的人未必都喜歡這兩種豆腐。四川的朋友可能更喜歡辣豆腐,江浙的人就可能對臭豆腐更喜歡一些。那麼,這種情況應該怎麼用設計模式表達呢?typedef struct _Tofu{
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 如果類是一種確定的資料類型,那麼模板就是一種對類的抽象。假設有這麼一種類,它需要進行資料的計算,而且類型還很多,那麼我們可能就要針對不同類型的資料定義不同的類。我們可以用下面一段代碼說明問題:class int_process{int a;int b;public:int_process(int m, int n):a(m), b(n) {}~int_process() {}int
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 如果說模板類定義的是一種資料類型,那麼模板函數定義的就是一種函數。既然是函數,那麼就有輸入資料和輸出資料。和模板類的概念差不多,模板函數的初衷也是為了在函數操作上抽取共同的特性,屏蔽的是類型的不同和差異。我們可以通過下面一個簡單的代碼說明問題:int int_compare(int a, int b){return a > b ? a : b;}double
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 前面我們討論基本上都是C語言的內容,還沒有真正觸及到C++的相關知識。從這篇部落格之後,我們將會更多觸及類的內容。類的屬性很多,今天我們討論主要就是建構函式、解構函式。 (1)如果沒有建構函式、解構函式呢?class apple{public:void print() const {return;}};
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 拷貝建構函式和複製函數是類裡面比較重要的兩個函數。兩者有什麼區別呢?其實也很簡單,我們可以舉個例子,加入有這樣一個類的定義:class apple{public:apple() { printf("apple()!\n");}apple(apple& a) { printf("copy apple()!\n");}apple& operator=(apple&
Time of Update: 2018-12-03
【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】 繼承是類的一個基本屬性,可是在類的繼承過程中,函數是怎麼初始化?怎麼析構的呢?我們不妨看看下面這樣的一段代碼?class employee{public:employee() { printf("employee()!\n");}~employee() { printf("~employee()!\n");}};class manager : public