設計模式(一) 何為設計模式,從重構開始設計模式

2021-10-06 10:24:07 字數 4194 閱讀 3231

從重構入手,了解設計模式。

完成乙個圖形軟體,畫出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 四人幫 的工作是將已有的模式識別出來。而非創造 模式的關鍵特徵 專案描述 名稱每個模式都有唯一用...