軟件設計——繼承、多態、綁定、重置、建立型設計模式、結構型設計模式和行爲設計模式

補充:算法

繼承:父類和子類之間共享數據和方法的機制,一個父類能夠有多個子類,父類描述了這些子類的公共屬性和方法,一個子類能夠繼承它的父類中的屬性和方法,這些屬性和操做在子類中沒必要定義,子類中還能夠定義本身的屬性和方法。shell

 

多態:在收到消息時,對象要給予響應,不一樣的對象收到同一消息能夠產生徹底不一樣的結果設計模式

參數多態:一個類型是另外一個類型的子類型數據結構

過載多態:同一個名字在不一樣的上下文中所表明的含義不一樣ide

 

靜態綁定:在編譯時進行的工具

動態綁定:在運行時進行的,當一個對象發送消息請求服務時,要根據接收對象的具體狀況將請求的操做與實現的方法進行鏈接測試

 

重置/覆蓋:在子類中從新定義父類中已經定義的方法,其基本思想是經過一種動態綁定機制的支持,使得子類在繼承父類接口定義的前提下用適合本身要求的實現去置換父類中的相應實現ui

 

重載:一個類能夠具備多個同名而參數類型列表不一樣的方法,每一個方法實現本身的特定行爲spa

 

建立型設計模式:

抽象工廠(Abstract Factory):設計

① 意圖:

提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類

②模式適應於:

  • 一個系統要獨立於它的產品的建立、組合和表示時。
  • 一個系統要由多個產品系列中的一個配置時。
  • 當要強調一系列相關的產品對象的設計以便進行聯合使用時。
  • 當提供一個產品類庫,只想顯示它們的接口而不是現實時。

 

例:

使用一個汽車生產來作例子。抽象工廠模式以下:
       有一個抽象工廠類名爲Factory,工廠的做用是生產車的不一樣部件。
       有一個奔馳工廠BenzFactory繼承了這個Factory,專門用來生產奔馳車的部件。
       有一個奔馳工廠BMWFactory繼承了這個Factory,專門用來生產寶馬車的部件。
       有一個消費者類Consumer,專門組裝這些工廠生產的部件。

Class Factory
{
public:
    virtua Car* createCar();//生產車
    virtua Wheel* createWheel();//生產輪子
    Shell* Wheel* createShell();//生產車殼
    virtua Engine* createEngine();//生產引擎
}
Class BenzFactory:public Factory//奔馳工廠
{
    BenzCar* createCar();//生產奔馳車
    Wheel* createWheel();//生產奔馳輪子
    Shell* createShell();//生產奔馳車殼
    Engine* createEngine();//生產奔馳引擎
}
Class BMWFactory:public Factory//寶馬工廠
{
    BMWCar* createCar();//生產寶馬車
    Wheel* createWheel();//生產寶馬輪子
    Shell* createShell();//生產寶馬車殼
    Engine* createEngine();//生產寶馬引擎
}

class Consumer
{
    Car* createCar(Factory * factory)
    {
        auto car= factory->createCar();
        auto wheel= factory->createWheel();
        auto shell= factory->createShell();
        auto engine= factory->createEngine();
        //一大堆組裝過程,這裏用戶得本身處理
        wheel->check();//輪胎檢查
        shell->check();//車殼檢查
        shell->setColor();//車殼上漆
        engine->check();//引擎檢查

        car->add(wheel);
        car->add(shell);
        car->add(engine);
        return car;
    }
}
代碼,點擊展開

 

 

生成器(Builder):

①意圖:

將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示

②模式適用於:

  • 當建立複雜對象的算法應該孤立於該對象的組成部分以及它們的裝配方式時。
  • 當構造過程必須容許被構造的對象有不一樣的表示時。

 

工廠方法(Factory Method):

①意圖

定義一個用於建立對象的接口,讓子類決定實例化哪個類。Factory Method使一個類的實例化延遲到其子類

②模式適用於:

  • 當一個類不知道它所必須建立的對象的類的時候。
  • 當一個類但願由它的子類來指定它所建立的對象的時候
  • 當類將建立對象的職責委託給多個幫助子類中的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候

 

原型(Prototype):

①意圖:

用原型實例指定建立對象的種類,而且經過複製這些原型建立新的對象

②模式適用於:

  • 當一個系統應該獨立於它的產品建立、構成和表示時。
  • 當要實例化的類是在運行時刻指定時,例如,經過動態裝載
  • 爲了不建立一個與產品類層次平行的工廠類層次時
  • 當一個類的實例只能有幾個不一樣狀態組合中的一種時。創建相應數目的原型並克隆它們,可能比每次用合適的狀態手工實例化該類更方便一些。

 

單例(Singleton):

①意圖:

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點

②模式適用於:

  • 當類只能有一個實例而且客戶能夠從一個衆所周知的訪問點訪問它時。
  • 當這個惟一實例應該是經過子類化可擴展的,而且客戶無須更改代碼就能使用一個擴展的實例時。

 

結構型設計模式:

適配器(Adapter):

①意圖:

將一個類的接口轉換成客戶但願的另外一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做

②模式適應於:

  • 想使用一個已經存在的類,而它的接口不符合要求。。
  • 想建立一一個能夠服用的類,該類能夠與其餘不相關的類或不可預見的類(即那些接口可能不必定兼容的類)協同工做。。
  • (僅適用於對象Adapter)想使用一個已經存在的子類,可是不可能對每個都進行子類化以匹配它們的接口。對象適配器能夠適配它的父類接口。

 

橋接(Bridge):

①意圖:

將抽象部分與其實現部分分離,使它們均可以獨立地變化

②模式適用於:

  • 不但願在抽象和它的實現部分之間有一個固定的綁定關係。例如,這種狀況多是由於,在程序運行時刻實現部分應能夠被選擇或者切換。
  • 類的抽象以及它的實現都應該能夠經過生成子類的方法加以擴充。這是Bridge模式使得開發者能夠對不一樣的抽象接口和實現部分進行組合,並分別對它們進行擴充。
  • 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶代碼沒必要從新編譯。
  • (C++)想對客戶徹底隱藏抽象的實現部分。
  • 有許多類要生成的類層次結構。

  •  想在多個對象間共享實現(可能使用引用計數),但同時要求客戶並不知道這一點。

 

組合(Composite):

①意圖:

將對象組合成樹形結構以表示「部分-總體」的層次結構。Composite使得用戶對單個對象和組合對象的使用具備一致性

②模式適用於:

  • 想表示對象的部分-總體層次結構。
  • 但願用戶忽略組合對象與單個對象的不一樣,用戶將統一地使用組合結構中的全部對象。

 

裝飾(Decorator):

①意圖:

動態地給一個對象添加一些額外的職責。就增長功能而言,Decorator模式比生成子類更加靈活

②模式適用於:

  • 在不影響其餘對象的狀況下, 以動態、透明的方式給單個對象添加職責。
  • 處理那些能夠撤銷的職責。
  • 當不能採用生成子類的方式進行擴充時。一種狀況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增加。另種狀況多是,因爲類定義被隱藏,或類定義不能用於生成子類。

 

外觀(Facade):

①意圖:

爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用

②模式適用於:

  • 要爲一個複雜子系統提供一個簡單 接口時,子系統每每由於不斷演化而變得愈來愈複雜。大多數模式使用時都會產生更多更小的類,這使得子系統更具備可重用性,也更容易對子系統進行定製,但也給那些不須要定製子系統的用戶帶來一些使用上的困難。Facade能夠提供一個簡單的默認視圖,這一視圖對大多數用戶來講已經足夠,而那些須要更多的可定製性的用戶能夠越過Facade層。

  • 客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入Facade將這個子系統與客戶以及其餘的子系統分離,能夠提升子系統的獨立性和可移植性。

  • 當須要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。
    若是子系統之間是相互依賴的,則可讓它們僅經過Facade進行通訊,從而簡化了它免謝點們之間的依賴關係。

 

享元(Flyweight):

①意圖:

運用共享技術有效地支持大量細粒度的對象

②模式適用於:

  • 一個應用程序使用了大量的對象。
  • 徹底因爲使用大量的對象,形成很大的存儲開銷。

  • 對象的大多數狀態均可變爲外部狀態。

  • 應用程序不依賴於對象標識。因爲Flyweight 對象能夠被共享,因此對於概念上明顯有別的對象,標識測試將返回真值。
  • 若是刪除對象的外部狀態,那麼能夠用相對較少的共享對象取代不少組對象。

 

代理(Proxy):

①意圖:

爲其餘對象提供一種代理以控制對這個對象的訪問

②模式適用於:

  • 遠程代理(Remote Proxy)爲一個對象在不一樣地址空間提供局部表明
  • 虛代理(Virtual Proxy)根據須要建立開銷很大的對象。

  • 保護代理(Polecion Roxy)控制對原始對象的訪問,用於對象應該有不一樣的訪問權限的時候。
  • 智能引用(Smart Reference)取代了簡單的指針,它在訪問對象時執行一一些附加操做。典型用途包括:對指向實際對象的引用計數,這樣當該對象沒有引用時,能夠被自動釋放;當第次引用一個持久對象時,將它裝入內存:在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其餘對象不能改變它。

 

行爲設計模式:

責任鏈(Chain of Responsibility):

①意圖:

使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止

②模式適用於:

  • 多個的對象 能夠處理一一個請求,哪一個對象處理該請求運行時刻自動肯定。
  • 想在不明確指定接收 者的狀況下向多個對象中的一個提交一個請求。
  • 可處理一個請求的對象集合應被動態指定。

 

命令(Commnd):

意圖:

將一個請求封裝爲一個對象,從而使得能夠用不一樣的請求對客戶進行參數化:對請求排隊或記錄請求日誌,以及支持中可撤銷的操做。

模式適用於:

  • 抽象出待執行的動做以參 數化某對象。Command模式是過程語言中的回調機制的一個面向對象的替代品。

  • 在不一樣的時刻指定、 排列和執行請求。一個 Command 對象能夠有一個與初始請關的生存期。若是一個請求的接收者可用一種與地址空間無關的方式表達,那麼就能夠將負責該請求的命令對象傳遞給另外一個不一樣的進程並在那兒實現該請求。

  • 支持取消操做。 Command的Excute操做可在實施操做前將狀態存儲起來,在取治家
    做時這個狀態用來消除該操做的影響。Command接口必須添加一個Uece:操做可經過向後和向前遍歷這一列表並分別調用Uexecute和Execute來實現重數不限的該操做取消上一次Excute 調用的效果。執行的命令被存儲在一個歷史列表中。取消
    和「重作」。

  • 支持修改日誌。這樣當系統崩潰時,這些修改能夠被重作遍。 在Command接口中添加裝載操做和存儲操做,能夠用來保持變更的一個一致的修改日誌。從崩潰中恢復的過程包括從磁盤中從新讀入記錄下來的命令並用Execute操做從新執行它們。

  • 用構建在原語操做上的高層操做構造一個系統。 這樣一種結構在支持事務(Transaction)的信息系統中很常見。Command模式提供了對事務進行建模的方法。Command有一個公共接口,使得能夠用同一種方式調用全部的事務,同時使用該模式也易於添加新事務以擴展系統。

解釋器(Interpreter):

①意圖:

給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。  

②模式適用於:

  • 該文法簡單。對於複雜的發文,文法的類層次變得龐大而沒法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無須構建抽象語法樹便可解釋表達式,這樣能夠節省空間還可能節省時間。

  • 效率不是一個關鍵問題。最高效的解釋器一般不是經過直接解釋語法分析樹實現的,而是首先將它們轉換成另-種形式。不過,即便在這種狀況下,轉換器仍然可用該模式實現。

 

迭代器(Iterator):

①意圖:

提供種方法順序訪問一個聚合對象中的各個元素,且不須要暴露該對象的內部表示

②模式適用於:

  • 訪問一個聚 合對象的內容而無須暴露它的內部表示。

  • 支持對聚合對象的多種遍歷。

  • 爲遍歷不一樣的聚合結構提供一個統一的接口。

 

中介者(Mediator):

①意圖:

用一箇中介對象來封裝系列的對象交互。 中介者使各對象不須要 顯式地相互引用, 從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。

②模式適用於:

  • 一組對象以定義良好可是複雜的方式進行通訊,產生的相互依賴關係結構混亂且難以理解。

  • 一個對象引用其餘不少對象而且直接與這些對象通訊,致使難以複用該對象。
  • 想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。

 

備忘錄(Memento):

①意圖:

在不破壞封裝性的前提下捕獲一個對象的內部狀態,並在對象以外保存這個狀態。這樣以能夠將對象恢復到原先保存的狀態。

②模式適用於:

  • 必須保存一個對象在某一個時刻的 (部分)狀態,這樣之後須要時它才能恢復到先前的狀態。

  • 若是一個用接口來讓其餘對象直接獲得這些狀態,將會暴露對象的實現細節並破壞對象的封裝性。

 

觀察者(Observe):

①意圖:

定義對象間的一種對多 的依賴關係, 當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。

②模式適用於:

  • 當一個抽象模型有兩個方面,其中一個方面依賴於另外一個方面,將這二者封裝在獨立的對象中以使它們能夠各自獨立地改變和複用。

  •  

    當對一個對象的改變須要同時改變其餘對象,而不知道具體有多少對象有待改變時。

  • 當一個對象必須通知其餘對象,而它又不能假定其餘對象是誰,即不但願這些對象是緊耦合的。

 

狀態(State):

①意圖:

容許一個對象在其內部狀態改變時改變它的行爲。對象看起來彷佛修改了它的類。

②模式適用於:

  • 一個對象 的行爲決定於它的狀態,而且它必須在運行時 刻根據狀態改變它的行爲。

  • 一個操做中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態經常使用個或多個枚舉常量表示。一般,有多個操做包含這相同的條件結構。State模式將每個條件分支放入個獨立的類中。這使得開發者能夠根據對象自身的狀況將對象的狀態做爲一個對象,這對象能夠不依賴於其餘對象獨立變化。

 

策略(Strategy):

①意圖:

定義一系列的算法,把它們一個個封裝起來,而且使它們能夠相互替換。此模式使得算法能夠獨立於使用它們的客戶而變化。

②模式適用於:

  • 許多相關的類僅是行爲有異。「策略"提供了一種用多個行爲中的個行爲來配置一個類的方法。

  • 須要使用一個算法的不一樣變體。例如,定義一些反映不一樣空間的空間時間權衡的算法。當這些變體實現爲一個算法的類層次時,可使用策略模式。
  • 算法使用客戶不該該知道的數據。可以使用策略模式以免暴露覆雜的、與算法相關的數據結構。
  • 一個類定義了多種行爲,而且這些行爲在這個類的操做中以多個條件語句的形式出現,將相關的條件分支移入它們各自的Saley類中,以代替這些條件語句。

 

模板方法(templete Method):

①意圖:

定義一個操做中的算法骨架,而將一些步 驟延遲到子類中。Template Method使得子類能夠|不改變一個算法的結構便可重定義該算法的某些特定步驟。

②模式適用於:

  • 一次性實現一個算法的不變的部分,並將可變的行爲留給子類來實現。

  •  

    各子類中公共的行爲應被提取出來並集中到一個公共父類中,以免代碼重複。

  •  

    控制子類擴展。模板方法旨在特定點調用「hook"操做(默認的行爲,子類能夠在必要時進行重定義擴展),這就只容許在這些點進行擴展。

 

訪問者(Visitor):

①意圖:

  表示一個做用於某對象結構中的各元素的操做。它容許在不改變各元素的類的前提下定義做用於這些元素的新操做。

②模式適用於:

  • 一個對象 結構包含不少類對象,它們有不一樣的接口,而用戶想對這些對象實施一一些依賴於其具體類的操做。

  • 須要對個對象結構中的對象進行不少不一樣的而且不相關的操做,而又想要避免這些操做「污染」這些對象的類。Visitor 使得用戶能夠將相關的操做集中起來定義在一個類中。當該對象結構被不少應用共享時,用Visitor模式讓每一個應用僅包含須要用到的操做。

  •  

    定義對象結構的類不多改變,但常常須要在此結構上定義新的操做。改變對象結構類須要重定義對全部訪問者的接口,這可能須要很大的代價。若是對象結構類常常改變,那麼可能仍是在這些類中定義這些操做較好。

相關文章
相關標籤/搜索