設計框架
可複用面向對象軟件系統一般劃分為兩大類:應用程序工具箱和框架(Framework),我們平時開發的具體軟件都是應用程序,java的API屬于工具箱;而框架是構成一類特定軟件可複用設計的一組相互協作的類,EJB(EnterpriseJavaBeans)是Java應用于企業計算的框架。
框架通常定義了應用體系的整體結構類和對象的關系等等設計參數,以便于具體應用實現者能集中精力于應用本身的特定細節。框架主要記錄軟件應用中共同的設計決策,框架強調設計複用,因此框架設計中必然要使用設計模式。
另外,設計模式有助于對框架結構的理解,成熟的框架通常使用了多種設計模式,如果你熟悉這些設計模式,毫無疑問,你将迅速掌握框架的結構,我們一般開發者如果突然接觸EJBJ2EE等框架,會覺得特别難學,難掌握,那麼轉而先掌握設計模式,無疑是給了你剖析EJB或J2EE系統的一把利器。
設計原則
為什麼要提倡"Design Pattern"呢?根本原因是為了代碼複用,增加可維護性。那麼怎麼才能實現代碼複用呢?面向對象有幾個原則:開閉原則(Open Closed Principle,OCP)、裡氏代換原則(Liskov Substitution Principle,LSP)、依賴倒轉原則(Dependency Inversion Principle,DIP)、接口隔離原則(Interfce Segregation Principle,ISP)、合成/聚合複用原則(Composite/Aggregate Reuse Principle,CARP)、最小知識原則(Principle of Least Knowledge,PLK,也叫迪米特法則)。開閉原則具有理想主義的色彩,它是面向對象設計的終極目标。其他幾條,則可以看做是開閉原則的實現方法。
設計模式就是實現了這些原則,從而達到了代碼複用、增加可維護性的目的。
依賴倒轉原則
抽象不應該依賴于細節,細節應當依賴于抽象。
要針對接口編程,而不是針對實現編程。
傳遞參數,或者在組合聚合關系中,盡量引用層次高的類。
主要是在構造對象時可以動态的創建各種具體對象,當然如果一些具體類比較穩定,就不必在弄一個抽象類做它的父類,這樣有畫蛇添足的感覺
接口隔離原則
定制服務的例子,每一個接口應該是一種角色,不多不少,不幹不該幹的事,該幹的事都要幹。
合成/聚合複用原則
合成/聚合複用原則(Composite/Aggregate Reuse Principle ,CARP)經常又叫做合成複用原則。合成/聚合複用原則就是在一個新的對象裡面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達到複用已有功能的目的。它的設計原則是;要盡量使用合成/聚合,盡量不要使用繼承。
就是說要少用繼承,多用合成關系來實現。我曾經這樣寫過程序:有幾個類要與數據庫打交道,就寫了一個數據庫操作的類,然後别的跟數據庫打交道的類都繼承這個。結果後來,我修改了數據庫操作類的一個方法,各個類都需要改動。"牽一發而動全身"!面向對象是要把波動限制在盡量小的範圍。
在Java中,應盡量針對Interface編程,而非實現類。這樣,更換子類不會影響調用它方法的代碼。要讓各個類盡可能少的跟别人聯系,"不要與陌生人說話"。這樣,城門失火,才不至于殃及池魚。擴展性和維護性才能提高
基本模式
綜述
設計模式分為三種類型,共23種。
創建型模式:單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。
結構型模式:适配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。
行為型模式:模版方法模式、命令模式、叠代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式(Interpreter模式)、狀态模式、策略模式、職責鍊模式、訪問者模式。
按字典序排列簡介如下。
Abstract Factory(抽象工廠模式):提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
Adapter(适配器模式):将一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
Bridge(橋接模式):将抽象部分與它的實現部分分離,使它們都可以獨立地變化。
Builder(建造者模式):将一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
Chain of Responsibility(職責鍊模式):為解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。将這些對象連成一條鍊,并沿着這條鍊傳遞該請求,直到有一個對象處理它。
Command(命令模式):将一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可取消的操作。
Composite(組合模式):将對象組合成樹形結構以表示“部分-整體”的層次結構。它使得客戶對單個對象和複合對象的使用具有一緻性。
Decorator(裝飾模式):動态地給一個對象添加一些額外的職責。就擴展功能而言,它比生成子類方式更為靈活。
Facade(外觀模式):為子系統中的一組接口提供一個一緻的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
Factory Method(工廠模式):定義一個用于創建對象的接口,讓子類決定将哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。
Flyweight(享元模式):運用共享技術有效地支持大量細粒度的對象。
Interpreter(解析器模式):給定一個語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
Iterator(叠代器模式):提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的内部表示。
Mediator(中介模式):用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
Memento(備忘錄模式):在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外保存這個狀态。這樣以後就可将該對象恢複到保存的狀态。
Observer(觀察者模式):定義對象間的一種一對多的依賴關系,以便當一個對象的狀态發生改變時,所有依賴于它的對象都得到通知并自動刷新。
Prototype(原型模式):用原型實例指定創建對象的種類,并且通過拷貝這個原型來創建新的對象。
Proxy(代理模式):為其他對象提供一個代理以控制對這個對象的訪問。
Singleton(單例模式):保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。單例模式是最簡單的設計模式之一,但是對于Java的開發者來說,它卻有很多缺陷。在九月的專欄中,David Geary探讨了單例模式以及在面對多線程(multi-threading)、類裝載器(class loaders)和序列化(serialization)時如何處理這些缺陷。
State(狀态模式):允許一個對象在其内部狀态改變時改變它的行為。對象看起來似乎修改了它所屬的類。
Strategy(策略模式):定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客戶。
Template Method(模闆方法模式):定義一個操作中的算法的骨架,而将一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
Visitor(訪問者模式):表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
從下一節開始,詳細描述以下每一種設計模式。
工廠模式
意圖
定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method 使一個類的實例化延遲到其子類。
适用性
當一個類不知道它所必須創建的對象的類的時候。
當一個類希望由它的子類來指定它所創建的對象的時候。
當類将創建對象的職責委托給多個幫助子類中的某一個,并且你希望将哪一個幫助子類是代理者這一信息局部化的時候。
抽象工廠模式
意圖
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
适用性
一個系統要獨立于它的産品的創建、組合和表示時。
一個系統要由多個産品系列中的一個來配置時。
當你要強調一系列相關的産品對象的設計以便進行聯合使用時。
當你提供一個産品類庫,而隻想顯示它們的接口而不是實現時。
建造者模式
意圖
将一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
适用性
當創建複雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。
當構造過程必須允許被構造的對象有不同的表示時。
原型模式
意圖
用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
适用性
當要實例化的類是在運行時刻指定時,例如,通過動态裝載;或者
為了避免創建一個與産品類層次平行的工廠類層次時;或者
當一個類的實例隻能有幾個不同狀态組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合适的狀态手工實例化該類更方便一些。
單例模式
意圖
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
适用性
當類隻能有一個實例而且客戶可以從一個衆所周知的訪問點訪問它時。
當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。
适配器模式
意圖
将一個類的接口轉換成另外一個客戶希望的接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
适用性
你想使用一個已經存在的類,而它的接口不符合你的需求。
你想創建一個可以複用的類,該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
(僅适用于對象Adapter)你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的接口。對象适配器可以适配它的父類接口。
橋接模式
意圖
将抽象部分與它的實現部分分離
,使它們都可以獨立地變化。
适用性
你不希望在抽象和它的實現部分之間有一個固定的綁定關系。例如這種情況可能是因為,在程序運行時刻實現部分應可以被選擇或者切換。
類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時B r i d g e 模式使你可以對不同的抽象接口和實現部分進行組合,并分别對它們進行擴充。
對一個抽象的實現部分的修改應對客戶不産生影響,即客戶的代碼不必重新編譯。
(C++)你想對客戶完全隐藏抽象的實現部分。在C++中,類的表示在類接口中是可見的。
有許多類要生成。這樣一種類層次結構說明你必須将一個對象分解成兩個部分。Rumbaugh稱這種類層次結構為“嵌套的普化”(nested generalizations )。
你想在多個對象間共享實現(可能使用引用計數),但同時要求客戶并不知道這一點。一個簡單的例子便是Coplien的String類,在這個類中多個對象可以共享同一個字符串表示(StringRep)。
組合模式
意圖
将對象組合成樹形結構以表示“部分-整體”的層次結構。C o m p o s i t e 使得用戶對單個對象和組合對象的使用具有一緻性。
适用性
你想表示對象的部分—整體層次結構。
你希望用戶忽略組合對象與單個對象的不同,用戶将統一地使用組合結構中的所有對象。
裝飾模式
意圖
動态地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。
适用性
在不影響其他對象的情況下,以動态、透明的方式給單個對象添加職責。
處理那些可以撤消的職責。
當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合将産生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隐藏,或類定義不能用于生成子類。
門面模式
意圖
為子系統中的一組接口提供一個一緻的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
适用性
當你要為一個複雜子系統提供一個簡單接口時。子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會産生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的缺省視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過Facade層。
客戶程序與抽象類的實現部分之間存在着很大的依賴性。引入Facade将這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
當你需要構建一個層次結構的子系統時,使用門面模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關系。
享元模式
意圖
運用共享技術有效地支持大量細粒度的對象。
适用性
一個應用程序使用了大量的對象。
完全由于使用大量的對象,造成很大的存儲開銷。
對象的大多數狀态都可變為外部狀态。
如果删除對象的外部狀态,那麼可以用相對較少的共享對象取代很多組對象。
應用程序不依賴于對象标識。由于Flyweight對象可以被共享,對于概念上明顯有别的對象,标識測試将返回真值。
代理模式
意圖
為其他對象提供一種代理以控制對這個對象的訪問。
适用性
在需要用比較通用和複雜的對象指針代替簡單的指針的時候,使用Proxy模式。下面是一些可以使用Proxy模式常見情況:
遠程代理(Remote Proxy)為一個對象在不同的地址空間提供局部代表。
虛代理(Virtual Proxy)根據需要創建開銷很大的對象。
保護代理(Protection Proxy)控制對原始對象的訪問。保護代理用于對象應該有不同的訪問權限的時候。
智能指引(Smart Reference)取代了簡單的指針,它在訪問對象時執行一些附加操作。它的典型用途包括:
職責鍊模式
意圖
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。将這些對象連成一條鍊,并沿着這條鍊傳遞該請求,直到有一個對象處理它為止。
适用性
有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動确定。
你想在不明确指定接收者的情況下,向多個對象中的一個提交一個請求。
可處理一個請求的對象集合應被動态指定。
命令模式
意圖
将一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可取消的操作
适用性
像上面讨論的MenuItem對象那樣,抽象出待執行的動作以參數化某對象。你可用過程語言中的回調(callback)函數表達這種參數化機制。所謂回調函數是指函數先在某處注冊,而它将在稍後某個需要的時候被調用。Command模式是回調機制的一個面向對象的替代品。
在不同的時刻指定、排列和執行請求。一個Command對象可以有一個與初始請求無關的生存期。如果一個請求的接收者可用一種與地址空間無關的方式表達,那麼就可将負責該請求的命令對象傳送給另一個不同的進程并在那兒實現該請求。
支持取消操作。Command的Execute操作可在實施操作前将狀态存儲起來,在取消操作時這個狀态用來消除該操作的影響。Command接口必須添加一個Execute操作,該操作取消上一次Execute調用的效果。執行的命令被存儲在一個曆史列表中。可通過向後和向前遍曆這一列表并分别調用Unexecute和Execute來實現重數不限的“取消”和“重做”。
支持修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。在Command接口中添加裝載操作和存儲操作,可以用來保持變動的一個一緻的修改日志。從崩潰中恢複的過程包括從磁盤中重新讀入記錄下來的命令并用Execute操作重新執行它們。
用構建在原語操作上的高層操作構造一個系統。這樣一種結構在支持事務(Transaction)的信息系統中很常見。一個事務封裝了對數據的一組變動。Command模式提供了對事務進行建模的方法。Command有一個公共的接口,使得你可以用同一種方式調用所有的事務。同時使用該模式也易于添加新事務以擴展系統。
解析器模式
意圖
給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
适用性
當有一個語言需要解釋執行,并且你可将該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當存在以下情況時該模式效果最好:
叠代器模式
意圖
提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的内部表示。
适用性
訪問一個聚合對象的内容而無需暴露它的内部表示。
支持對聚合對象的多種遍曆。
為遍曆不同的聚合結構提供一個統一的接口(即支持多态叠代)。
中介模式
意圖
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
适用性
一組對象以定義良好但是複雜的方式進行通信。産生的相互依賴關系結構混亂且難以理解。
一個對象引用其他很多對象并且直接與這些對象通信,導緻難以複用該對象。
想定制一個分布在多個類中的行為,而又不想生成太多的子類。
備忘錄模式
意圖
在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外保存這個狀态。這樣以後就可将該對象恢複到保存的狀态。
适用性
必須保存一個對象在某一個時刻的(部分)狀态,這樣以後需要時它才能恢複到先前的狀态。
如果一個用接口來讓其它對象直接得到這些狀态,将會暴露對象的實現細節并破壞對象的封裝性。
觀察者模式
意圖
定義對象間的一種一對多的依賴關系,當一個對象的狀态發生改變時,所有依賴于它的對象都得到通知并被自動更新。
适用性
當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。将這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。
當對一個對象的改變需要同時改變其它對象,不知道具體有多少對象有待改變。
當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之,你不希望這些對象是緊密耦合的。
狀态模式
意圖
允許一個對象在其内部狀态改變時改變它的行為。對象看起來似乎修改了它的類。
适用性
一個對象的行為取決于它的狀态,并且它必須在運行時刻根據狀态改變它的行為。
一個操作中含有龐大的多分支的條件語句,且這些分支依賴于該對象的狀态。這個狀态通常用一個或多個枚舉常量表示。通常,有多個操作包含這一相同的條件結構。State模式模式将每一個條件分支放入一個獨立的類中。這使得你可以要所對象自身的情況将對象的狀态作為一個對象,這一對象可以不依賴于其他對象而獨立變化。
策略模式
意圖
定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。
适用性
許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。
需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間/時間權衡的算法。當這些變體實現為一個算法的類層次時,可以使用策略模式。
算法使用客戶不應該知道的數據。可使用策略模式以避免暴露複雜的、與算法相關的數據結構。
一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。将相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
模版模式
意圖
定義一個操作中的算法的骨架,而将一些步驟延遲到子類中。Te m p l a t e M e t h o d 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
适用性
一次性實現一個算法的不變的部分,并将可變的行為留給子類來實現。
各子類中公共的行為應被提取出來并集中到一個公共父類中以避免代碼重複。這是Opdyke和Johnson所描述過的“重分解以一般化”的一個很好的例子。首先識别現有代碼中的不同之處,并且将不同之處分離為新的操作。最後,用一個調用這些新的操作的模闆方法來替換這些不同的代碼。
控制子類擴展。模闆方法隻在特定點調用“hook”操作,這樣就隻允許在這些點進行擴展。
訪問者模式
意圖
表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
适用性
一個對象結構包含很多類對象,它們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作。
需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而你想避免讓這些操作“污染”這些對象的類。Visitor使得你可以将相關的操作集中起來定義在一個類中。當該對象結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
定義對象結構的類很少改變,但經常需要在此結構上定義新的操作。改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價。如果對象結構類經常改變,那麼可能還是在這些類中定義這些操作較好。
設計步驟
綜述
如何把設計模式的采用和日益臨近的最後期限、緊縮的預算和很多公司現有的有限團隊資源相結合?以下是成功制訂設計模式的步驟。
強大的通信和培訓
許多機構擁有領先技術,可能正式通過了設計師論壇的論證或者非正式的公認專家。這些領先廠商将推廣設計模式采用中的開放通信,并将培訓開發具體設計模式的團隊。通信應當跨開發團隊和項目以便預先防止采用豎井和多種惟一的實現(謹記每個Developer/Project AntiPattern的實現)。培訓可以采用正式的internal lunch-and-learns、正式的internal class或者派一些員工參加外部培訓。這些培訓方式将促進正确的設計模式應用程序。如果僅有極少的觀衆能夠參加培訓,最佳的候選人是那些感覺适合在回來後能夠培訓其同事的人。
設計模式采用指導
設計模式可用于使項目受益,但是他們也可能因為誤用而對應用程序造成損害。應當鼓勵采用他們,但是對其的采用應當受到審閱和驗證。設計模式可以包含在設計和開發過程中。在任何一種情況中,設計模式的使用應當由審閱者确認和驗證。在審閱過程中還可能會遇到這樣的情況,額外的設計模式不适用于最初包括的地方。即使環境中沒有進行正式的審閱,這一步驟也可以通過同事審閱或者團隊讨論來完成。這一步驟中的審閱者要麼是主要團隊的成員,要麼與他們建立開放通信。
指導采用對于broad exposure類别的設計模式非常關鍵。這些設計模式具有很多相關的風險,因為他們将創建依賴性。這些依賴性可能在一些對象類中,例如,隻工作在更加廣泛的DAO設計模式實現範圍中的數據訪問對象(DAO)、或者跨應用程序邊界(如使用Value Object設計模式在應用程序和應用程序層之間傳輸數據)。這些設計模式也可以由項目中的其他人或者不同項目的人實現,而且實現應當重新使用,不同于創建另一種獨特的實現。
重用實現,不隻是設計模式
隻要在創建自己的設計模式實現中有一定的滿足,團隊和公司就可以在重用發生在代碼層時,而不是設計創意層時獲得更多益處。使企業獲益的最初設計模式是改進的實現。但是,真正的目标是重用實現。重用實現将導緻:a)其他可重用的類(取決于公共實現);b)縮短開發時間和降低成本;c)縮短維護時間和降低成本;d)在應用程序之間和内部輕松集成。
這種重用對broad exposure設計模式非常重要(有時是基本的)。這些設計模式創建了外部依賴性(集成将從公共實現中受益)或者産生全部的自定義類庫(如果有公共基礎将可重用)。isolated use設計模式也可以從重用中獲益,但是如果他們是根據具體情況定制的,他們就非常難以重用。
有時您可能會問自己:“如果重用比較好,為什麼設計模式和可以重用的實現不可以一同應用呢?”在我們讨論設計模式如何使更多讀者獲益的時候才會讨論這個問題。如果可能,如果已經預定義了實現,那麼達到廣泛适用性這個目标就會非常困難。然而,一旦設計模式被應用到特殊的問題域或者技術基礎設施中,那麼就可以重用在該環境中産生的實現。
架構中的設計模式
這看起來像是一件可怕的任務,需要掌握設計模式如何應用在實際情況中,如何構建優質的實現,以及如何促進重用實現。完成該任務的方法之一就是在環境中引入應用程序架構。應用程序架構提供了應用程序需要的結構,從而使開發團隊可以關注應用程序的域邏輯。這包含了已實現的設計模式。除了重用設計模式概念或者單個實現之外,可以在多個項目和應用程序之間重用架構。這種共享的公共實現确保了兼容性,并為開發和維護多種不同的實現提供了一種低成本替代方案。兼容性提供了重新使用需要的技術基礎。沒有足夠的篇幅在這裡深入讨論架構的其他重要品質,如運行時監測和管理、可配置應用程序邏輯和适應性行為等。您可以從Carnegie Mellon Software Engineering Institute 中學習到更多有關架構的知識。
四要素
綜述
設計模式使人們可以更加簡單方便地複用成功的設計和體系結構。将已證實的技術表述成設計模式也會使新系統開發者更加容易理解其設計思路。
模式名稱(pattern name)
一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。命名一個新的模式增加了我們的設計詞彙。設計模式允許我們在較高的抽象層次上進行設計。基于一個模式詞彙表,我們自己以及同事之間就可以讨論模式并在編寫文檔時使用它們。模式名可以幫助我們思考,便于我們與其他人交流設計思想及設計結果。找到恰當的模式名也是我們設計模式編目工作的難點之一。
問題(problem)
描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因後果,它可能描述了特定的設計問題,如怎樣用對象表示算法等。也可能描述了導緻不靈活設計的類或對象結構。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。
解決方案(solution)
描述了設計的組成成分,它們之間的相互關系及各自的職責和協作方式。因為模式就像一個模闆,可應用于多種不同場合,所以解決方案并不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象組合)來解決這個問題。
效果(consequences)
描述了模式應用的效果及使用模式應權衡的問題。盡管我們描述設計決策時,并不總提到模式效果,但它們對于評價設計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關注對時間和空間的衡量,它們也表述了語言和實現問題。因為複用是面向對象設計的要素之一,所以模式效果包括它對系統的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
四人幫
Go F(“四人幫”,又稱Gang of Four,即Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四人)的《設計模式》,原名《Design Patterns: Elements of Reusable Object-Oriented Software》(1995年出版,出版社:Addison Wesly Longman.Inc),第一次将設計模式提升到理論高度,并将之規範化。該書提出了23種基本設計模式。時至今日,在可複用面向對象軟件的發展過程中,新的設計模式仍然不斷出現。



















