從重構入手,了解設計模式。
完成乙個圖形軟體,畫出line和我rect
#include #include using namespace std;
//畫圖
class point
;class line
void draw (int i)
};class rect
void draw (int i)
};class paint
else if(type == 2)
}//顯示(分解處理)
void paintshow()
for(vector::iterator ite = m_vecrect.begin(); ite != m_vecrect.end(); ite++)
} };
int main()
//列印以下內容
line
rect
draw line
draw rect
#include #include using namespace std;
//畫圖
class point
;class sharpe //不同處
; virtual void draw(int i){};
};class line : public sharpe
void draw (int i)
};class rect : public sharpe
void draw (int i)
};class paint
else if(type == 2)
}//顯示(抽象統一處理)
void paintshow() }
};int main()
//列印以下內容
line
rect
draw line
draw rect
現在把上面的需求再增加乙個,多了乙個circle列印圓形的功能
#include #include using namespace std;
//畫圖
class point
;class line
void draw (int i)
};class rect
void draw (int i)
};class circle //1
void draw (int i)
};class paint
else if(type == 2)
else if(type == 3) //3
}//顯示
void paintshow()
for(vector::iterator ite = m_vecrect.begin(); ite != m_vecrect.end(); ite++)
for(vector::iterator ite = m_veccircle.begin(); ite != m_veccircle.end(); ite++) //4
} };
int main()
#include #include using namespace std;
//畫圖
class point
;class sharpe
; virtual void draw(int i){};
};class line : public sharpe
void draw (int i)
};class rect : public sharpe
void draw (int i)
};class circle : public sharpe //1
void draw (int i)
};class paint
else if(type == 2)
else if(type == 3)
}//顯示
void paintshow() }
};int main()
//列印以下內容
line
rect
circle
draw line
draw rect
draw circle
抽象比分解解決問題修改起來更方便,可復用性強
c++小知識
class a;
class b;
class c;繼承自b
vectort;
vectort; //使用指標可以使用多型
#include #include using namespace std;
enum color
;//畫圖
class point
;class sharpe
; virtual void draw(int i){}; //3,沒有變化的draw1、draw2\ 5繼承的人都有用到draw
};class color
};class pen
};class line : public sharpe
line()
void draw (int i)
private:
void drawtest(){} //5
};class rect : public sharpe
void draw (int i)
};class circle : public sharpe
void draw (int i)
};class paint
else if(type == 2)
else if(type == 3)
}//顯示
void paintshow() }
};int main()
//列印以下內容
line
rect
circle
draw line
draw rect
draw circle
設計模式七大原則(c++描述)
1.依賴倒置原則dip(面對介面程式設計,不要對實現程式設計)
高層模組(穩定)不依賴底層模組(變化),二者都要依賴抽象(穩定)
抽象(穩定)不依賴實現細節(變化),實現細節應該依賴抽象(穩定)
如:vector m_vecpic; 針對介面,而不是真實型別
2.開放封閉原則(ocp)
對擴充套件開放,對更改封閉
如上例需要新增畫圓圈,秩序新增class circle即可,其他不用更改
3.單一職責原則(srp)
乙個類只有乙個引起它變化的原因,比如:
比如:sharp類只有乙個draw類是變化的,需要與眾不同的。
4.liskov替換原則(lsp)
子類必須能替換父類(父類的功能,子類不能有父類同名的非虛函式)
繼承表達,型別抽象(line和rect兩個對外統一為sharpe替換)
5.介面隔離原則(isp)
介面要小(不是介面的函式都用private)
繼承的介面類那些虛函式都要有用到,不然就把他拆分掉,使用多繼承
6.優先使用物件組合而不是類繼承(繼承應該是生物和動物的包含關係,而不是簡單的父親和兒子的繼承關係)
繼承子類和父類耦合度高
物件組合要求物件介面的合作,耦合度低
7.封裝變化點
封裝變化點,一側穩定,一側變化。穩定如paint類,是變化的,而sharpe是穩定的,line和rect是變化的。
8.迪公尺特原則(最少知道原則)
乙個類裡面不管屬性還是行為,用到的其他類盡量少。
需求變化的點和穩定的點
提高復用
重構而不是直接使用設計模式
a 靜態-》動態(a::test() 呼叫改為 a->test();)
b 早繫結-》晚繫結 (void printtest(a &a) a應該只是乙個介面類,並且test是乙個虛函式)
c 繼承-》組合(類a繼承類b 改為 類a包含類b元素)
d 編譯時依賴-》執行時依賴()
e 緊耦合-》松耦合(分介面出來)
001 設計模式,重構,設計原則
一 起因 的復用是我們追求的境界,因為復用我們可以減輕我們工作量,這就是我們追求設計最初的目的.在物件導向的設計中,的復用最常見的方式有兩種 1 繼承的方式 由於繼承,子類就擁有了父類的方法,那麼我們就沒必要重新複製一遍父類的實現方式,這是一種復用方式.但是,繼承會帶來一些列的問題.因為一旦繼承,我...
設計模式 工廠設計模式 一
工廠設計模式 就是當我們需要批量建立多種型別的物件時 需要用到,主要分為三種形式 1 靜態工廠,也叫簡單工廠模式,就是你傳乙個型別我建立對應的型別,spring中主要用到的就是這種模式 不多說,直接上 通用的產品介面,product 這個看需求,也可以定義為抽象類,根據你的物件之間的關係來定的 pa...
設計模式(一) 設計模式概述
模擬建築學 質量可以客觀評價 我們可以得到設計模式背後的觀點 軟體系統的質量可以客觀度量。模式的描述 模式的名稱 模式的目的,即要解決的問題 實現方法 為了實現該模式我們必須考慮的限制和約數因素 gof 四人幫 的工作是將已有的模式識別出來。而非創造 模式的關鍵特徵 專案描述 名稱每個模式都有唯一用...