Time of Update: 2018-12-03
裝飾模式 動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比產生子類更為靈活。
Time of Update: 2018-12-03
簡單原廠模式的最大優點在於工廠類包含了必要的邏輯判斷,根據用戶端的選擇條件動態執行個體化相關的類,對於用戶端來說,去除了與具體產品的依賴。(當添加新的方法的時候必然要改變工廠類,例如給運算工廠類的方法添加“case”判斷,違背了開放-封閉原則) Factory 方法模式實現時,用戶端需要決定執行個體化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,Factory 方法把簡單工廠的內部邏輯判斷移到了用戶端代碼來進行。你想要加功能,本來是改工廠類的,而現在是修改用戶端!
Time of Update: 2018-12-03
A.2 類與執行個體 對象是一個自包含的實體,用一組可識別的特性和行為來標識。 物件導向編程:Object-Oriented Programming 類就是具有相同的屬性和功能的對象的抽象的集合。 執行個體,就是一個真實的對象。執行個體化就是建立對象的過程,使用new關鍵字來建立。A.3 構造方法 構造方法,又叫建構函式,其實就是對類進行初始化。構造方法與類同名,無傳回值,也不需要void, 在new時候調用。聲明public: Cat(void);public: ~
Time of Update: 2018-12-03
原型模式(Prototype),用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。 原型模式其實就是從一個對象再建立另外一個可定製的對象,而且不需要知道任何建立的細節。
Time of Update: 2018-12-03
2010-10-18 9月24號的時候開始看大話設計模式覺得非常好,當時就決定十一的時候要把23個設計模式看完,並且用C++實現一遍代碼,結構十一玩了三天后面又加班,最後只是看了一遍,唯寫了幾章的代碼,然後就拖到現在,從今天開始好好寫,一天一個設計模式。原廠模式從一個簡單的計算機開始,一開始使用一個main函數搞定所有問題,然後業務與邏輯分離,將函數的實現寫到一個函數裡,到最後是把每種運算方式都寫成一個類,運用工廠方式。讓俺真正體會到了物件導向編程的封裝,繼承和多態。下面是俺寫的代碼。主函數
Time of Update: 2018-12-03
感覺就是父類中定義個方法的介面,讓子類去具體實現,每個子類的實現方式都不一樣。 既然用了繼承,並且肯定這個繼承有意義,就應該要成為子類的模板,所有重複的代碼都應該要上升到父類去,而不是讓每個子類都去重複。 當我們要完成在某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更詳細的層次上的實現可能不同時,我們通常考慮用模板方法模式來處理。 模板方法模式:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
Time of Update: 2018-12-03
轉自:http://blog.163.com/prevBlogPerma.do?host=gpww&srl=118268164200996103932731&mode=prev《編程之美》中提到了“買票找零”問題,查閱了下資料,此問題和卡特蘭數 Cn有關,其定義如下:卡特蘭數真是一個神奇的數字,很多組合問題的數量都和它有關係,例如:Cn= 長度為 2n的 Dyck words的數量。 Dyck words是由 n個 X和 n個 Y組成的字串,並且從左往右數, Y的數量不超過 X,
Time of Update: 2018-12-03
迪米特法則(LoD)(也叫最少知識原則),如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三者轉寄這個調用。
Time of Update: 2018-12-03
單一職責原則: 就一個類而言,應該僅有一個引起它變化的原因 軟體設計真正要做的許多東西,就是發現職責並把那些職責相互分離。如何判斷演算法應該分離出類類呢? 如果你能夠想到多於一個的動機去改變一個類,那麼這個類就具有多於一個的職責,此時就應該考慮類的職責分離。 如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或者抑制這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會遭受到意想不到的破壞。
Time of Update: 2018-12-03
螺旋隊列: 73 74 75 76 77 78 79 80 81 72 43 44 45 46 47 48 49 50 71 42 21 22 23 24 25 26 51 70 41 20 7 8 9 10 27 52 69 40 19 6 1 2 11 28 53 68 39 18 5
Time of Update: 2018-12-03
已知類String 的原型為:class String{public:String(const char *str = NULL); // 普通建構函式String(const String &other); // 拷貝建構函式~ String(void); // 解構函式String & operate =(const String &other); // 賦值函數private:char *m_data; // 用於儲存字串};編寫String 的上述4 個函數//
Time of Update: 2018-12-03
面板模式(Facade),為子系統中的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 其實就是在用戶端和一堆子類中間加了一個簡單的介面,從而使得用戶端不需要知道一些更加細節的東西。充分體現了依賴倒轉原則(高層模組不依賴低層模組,它們都依賴於抽象)和迪米特法則(如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中一個類需要調用另一個類的某個方法的話,可以通過第三者轉寄這個調用)。
Time of Update: 2018-12-03
7.2 常見的記憶體錯誤及其對策 問題1: 記憶體配置未成功,卻使用了它 解決辦法:在使用記憶體之前檢查指標是否為NULL。如果指標p是函數的參數,那麼在函數的入口處用assert(p!=NULL)進行檢查。如果是用malloc或new來申請記憶體,應該用if(p==NULL)或if(p!=NULL)進行防錯處理。 問題2: 記憶體配置雖然成功,但是尚未初始化就引用它。 問題3: 記憶體配置成功並且已經初始化,但操作越過了記憶體的邊界 問題4:
Time of Update: 2018-12-03
建造者模式(Builder)(又叫產生器模式),將一個複雜物件的構建和表示分離,使得同樣的構建過程可以建立不同的表示。Builder是為建立一個Product對象的各個組件指定的抽象介面;ConcreteBuilder是具體的建造者,實現Builder介面,構造和裝配各個組件;Product是具體的產品;Director是指揮者,用來構建一個使用Builder介面的對象。
Time of Update: 2018-12-03
“在美國一所著名的教堂裡,一位非常有名望的牧師戴爾.泰勒,在一天中午向教會學校的學生們講了一個故事: 一年冬天,獵人帶著獵狗去打獵。獵人一槍擊中了一隻兔子的後腿,受傷的兔子拚命地逃生,獵狗在其後窮追不捨。可是追了一陣子,兔子跑得越來越遠了。獵狗知道實在追不上了,只好悻悻地回到獵人身邊。獵人氣急敗壞地說:“你真沒用,連一隻受傷的兔子都追不到。” 獵狗聽了很不服氣地辯解道:“我已經儘力而為了呀!” 兔子帶著傷成功地逃生回家後,它的兄弟們都圍過來驚訝地問它:“那隻獵狗很兇啊,
Time of Update: 2018-12-03
1) 使用sleep()函數時要包含標頭檔#include <windows.h>2) GetTickCount()可以得到“系統啟動到現在”所經曆時間的毫秒值,最多能夠統計到49.7天3) 64位整類型__int64,包含標頭檔stdlib.h,記得加底線 解法一 簡單的解法#include <stdio.h>#include <windows.h>int main(){ for(;;) { for(int i=0;i<960000000;i++
Time of Update: 2018-12-03
每一個演算法都值得好好地分析問題:假設有n塊大小不一的烙餅,那最少要翻幾次,才能達到最後大小有序的結果呢?分析與解法這個排序問題非常有意思,首先我們要弄清楚解決問題的關鍵操作——“單手每次抓幾塊餅,全部顛倒”。每次我們只能選擇最上方的一堆餅,一起翻轉。而不能一張張地直接抽出來,然後進行插入,也不能交換任意兩塊餅子。這說明基本的排序辦法都不太好用。那麼怎麼把這n個烙餅排好序呢?由於每次操作都是針對最上面的餅,如果最底層的餅已經排序,那我們只用處理上面的n-1個烙餅。這樣,我們可以再簡化為n-2、n
Time of Update: 2018-12-03
開放-封閉原則 是說軟體實體(類、模組、函數等等)應該可以擴充,但是不可修改。 這個原則其實是有兩個特徵,一個是說“對於擴充是開放的(open for extension)”,另一個是說“對於更改是封閉的(closed for modification)” 怎樣的設計才能面對需求的改變卻可以保持相對穩定,從而使得系統可以在第一個版本以後不斷推出新版本呢?
Time of Update: 2018-12-03
NIM(1):一排石頭的遊戲 N塊石頭排成一行,每塊石頭有各自固定的位置。兩個玩家依次取石頭,每個玩家每次可以取其中任意一塊石頭,或者相鄰的兩塊石頭,石頭在遊戲過程中不能一位(即編號不會改變),最後能將剩下的石頭一次取光的玩家獲勝。
Time of Update: 2018-12-03
1. Const的用法:1) 定義const常量2) Const可以修飾函數的參數和傳回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。2. Const與#define相比有什麼不同?C++語言可以用const定義常量,也可以用#define定義常量,但是前者比後者有更多的優點。1) Const常量有資料類型,而宏常量沒有資料類型。編譯器可以對前者進行型別安全檢查,