設計模式的基礎是:多態。
?
設計模式綜覽表:
單例模式:是保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
簡單工廠模式:通過專門頂一個一個類來負責創建其它類的實例,被創建的實例通常都具有共同的父類。
工廠方法模式:定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類中。
抽象工廠模式:提供一個創建一系列相關或者相互依賴的接口,而無需指定他們具體的類。
適配器模式:將一個類的接口轉換成客戶希望的另外一個接口。使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
裝飾模式:動態地給一個對象添加一些額外的職責。就增加功能來說,此模式比生成子類更為靈活。
外觀模式:為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口是的這一子系統更加容易使用。
代理模式:為其他對象提供一種代理以控制對這個對象的訪問。
命令模式:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶端進行參數化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。
觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于他的對象都得到通知并被自動更新。
策略模式:準備一組算法,并將每一個算法封裝起來,是的它們可以互換。
模板方法模式:得子類可以不改變一個算法的結構即可重定義該算法得某些特定步驟。
?
面向對象設計原則
如何同時提高一個軟件系統得可維護性和可復用性是面向對象設計需要解決的核心問題之一。
面向對象設計原則為支持可維護性復用而誕生,這些原則蘊含再很多設計模式種,它們是從許多設計方案中總結出的指導性原則。
原則的目的:高內聚,低耦合。(一個類或一個函數,只做一件事,其他事情不做。降低類與類之間的耦合關系)
1、單一職責原則,類的職責單一,對外只提供一種功能,而引起類變化的原因都應該只有一個。
2、開閉原則,類的改動是通過增加代碼進行的,而不是修改源代碼
3、里氏代換原則,任何抽象類出現的地方都可以用他的實現類進行替換,實際就是虛擬機制,語言級別實現面向對象功能。
4、依賴倒轉原則,依賴于抽象(接口),不要依賴具體的實現,也就是針對接口編程。
5、接口隔離原則,不應該強迫用戶的程序以來他們不需要的接口方法。一個接口應該只提供一種對外功能,不應該把所有操作都封裝到一個接口中去。
6、合成復用原則,如果使用繼承,會導致父類的任何變換都可能影響到子類的行為。如果使用對象組合,就降低了這種依賴關系。對于繼承和組合,優先使用組合。
7、迪米特法則,一個對象應當對其他對象盡可能少的了解,從而降低各個對象之間的耦合,提高系統的可維護性。例如在一個程序中,各個模塊之間相互調用時,通常會提供一個統一的接口來實現。這樣其它模塊不需要了解另外一個模塊的內部實現細節,這樣當一個模塊內部發生改變時,不會影響其它模塊的使用。(黑盒原理)
?
//開閉原則,對擴展開放,對修改關閉,增加功能時通過增加代碼來實現,而不是去修改源代碼 //寫一個抽象類 class AbstractCaculator{ public:virtual int getResult() = 0; virtual void setOperatorNumber() = 0; };//寫一個加法類 class PlusCaculator:public AbstractCaculator{ public:virtual void setOperatorNumber(int a, int b){this->mA = a;this->mB = b;}virtual int getResult() {return mA + mB;}int mA;int mB; }
?
//迪米特法則,又叫最少知識原則 class AbstractBuilding{ public:virtual void sale() = 0; };//樓盤A class BuildingA:public AbstractBuilding{ public:BuildingA(){mQulity = "高品質"; }virtual void sale(){cout << "樓盤A" <<mQulity << "被售賣" << endl;} public:string mQulity; };//樓盤B class BuildingB:public AbstractBuilding{ public:BuildingB(){mQulity = "堤品質"; }virtual void sale(){cout << "樓盤B" <<mQulity << "被售賣" << endl;} public:string mQulity; };//中介類 class Mediator{ public:Mediator(){AbstractBuilding * building = new BuildingA;vBuilding->push_back(building);building = new BuildingB;vBuilding.push_back(building);}~Mediator(){//...} public:vector<AbstractBuilding*> vBuilding;}
?
//合成復用原則,繼承和組合優先使用組合 //針對具體類,不要使用繼承class AbstractCar{ public:virtual void run() = 0; };//大眾車 class VolkswagenCar:public AbstractCar{ public:virtual void run(){cout << "大眾車啟動。。。" <<endl;} };//寶馬車 class BMWCar:public AbstractCar{ public:virtual void run(){cout << “寶馬車啟動” << endl;}};
?