?
軟件開發(fā)的相關(guān)技術(shù)
??????????????????????作者:naven
2005-5-10
?
1
、
Rational
統(tǒng)一開發(fā)過程(
Rational Unified Process
簡稱
RUP
)
是軟件開發(fā)隊伍的最佳實踐
?
什么是
Rational Unified Process
RUP
是軟件工程化過程它提供了在開發(fā)機構(gòu)中分派任務(wù)和責任的紀律化方法它的目標是在可預見的日程和預算前提下確保滿足最終用戶需求的高質(zhì)量產(chǎn)品
RUP
是有效使用
Unified Modeling Language
(
UML
)的指南。是良好溝通需求體系結(jié)構(gòu)和設(shè)計的工業(yè)標準語言。
UML
是由
Rational
軟件公司創(chuàng)建現(xiàn)在由標準化對象管理機構(gòu)(
OMG
)維護
?
“統(tǒng)一過程”概述
“統(tǒng)一過程”是軟件開發(fā)過程。軟件開發(fā)過程是將用戶的需求轉(zhuǎn)化為一個軟件系統(tǒng)的一系列活動的總稱。然而,“統(tǒng)一過程”不僅僅是一個過程。它是一個通用過程框架,可以應付種類廣泛的軟件系統(tǒng)、不同的應用領(lǐng)域、不同的組織類型、不同的性能水平和不同的項目規(guī)模。
“統(tǒng)一過程”是基于組件的,這意味著利用它開發(fā)的軟件系統(tǒng)是由組件構(gòu)成的,組件之間通過定義良好的接口相互聯(lián)系
。
在準備軟件系統(tǒng)的所有藍圖的時候,“統(tǒng)一過程”使用的是“統(tǒng)一建模語言(
Unified Modeling anguage
)”。事實上,
UML
是“統(tǒng)一過程”的有機組成部分——它們是被同步開發(fā)的
。
然而,真正使“統(tǒng)一過程”與眾不同的方面可以用三個句話來表達:它是用例驅(qū)動的、以基本架構(gòu)為中心的、迭代式和增量性的。正是這些特征使得“統(tǒng)一過程”卓爾不群。
“統(tǒng)一過程”是用例驅(qū)動的“統(tǒng)一過程”是用例驅(qū)動的“統(tǒng)一過程”是用例驅(qū)動的“統(tǒng)一過程”是用例驅(qū)動的開發(fā)軟件系統(tǒng)的目的是要為該軟件系統(tǒng)的用戶服務(wù)。因此,要創(chuàng)建一個成功的軟件系統(tǒng),我們必須明白其潛在用戶需要什么
。
?
2
、統(tǒng)一模語言
UML
概述
標準建模語言
UML
的重要內(nèi)容可以由下列五類圖
(
共
9
種圖形
)
來定義
:
·第一類是用例圖
,
從用戶角度描述系統(tǒng)功能
,
并指出各功能的操作者。
·第二類是靜態(tài)圖
(Static diagram),
包括類圖、對象圖和包圖。其中類圖描述系統(tǒng)中類的靜態(tài)結(jié)構(gòu)。不僅定義系統(tǒng)中的類
,
表示類之間的聯(lián)系如關(guān)聯(lián)、依賴、聚合等
,
也包括類的內(nèi)部結(jié)構(gòu)
(
類的屬性和操作
)
。類圖描述的是一種靜態(tài)關(guān)系
,
在系統(tǒng)的整個生命周期都是有效的。對象圖是類圖的實例
,
幾乎使用與類圖完全相同的標識。他們的不同點在于對象圖顯示類的多個對象實例
,
而不是實際的類。一個對象圖是類圖的一個實例。由于對象存在生命周期
,
因此對象圖只能在系統(tǒng)某一時間段存在。包由包或類組成
,
表示包與包之間的關(guān)系。包圖用于描述系統(tǒng)的分層結(jié)構(gòu)。
·第三類是行為圖
(Behavior diagram),
描述系統(tǒng)的動態(tài)模型和組成對象間的交互關(guān)系。
·第四類是交互圖
(Interactive diagram),
描述對象間的交互關(guān)系。
·第五類是實現(xiàn)圖
( Implementation diagram )
。
?
RUP
及
UML
缺點:過于復雜甚至有些啰嗦。
?
?
3
、面向?qū)ο筌浖_發(fā)和過程
A
代碼是軟件開發(fā)的基礎(chǔ)
編碼是軟件開發(fā)過程中最基本、最底層的技藝,然而也是最重要的技藝。任何一個領(lǐng)域的專家都需要花費大量的時間來進行基本技藝的鍛煉,木匠需要花費大量的時間來鍛煉他們對各種工具的掌握,廚師則需要練習刀工和火候。程序員也是一樣的,對我們來說,語言的各種特性必須要了然于胸。而對軟件的管理也需要從代碼做起。
面向?qū)ο蟮拇a已經(jīng)在現(xiàn)在的軟件開發(fā)中占據(jù)了主流的位置,面向?qū)ο蟮乃悸芬灿衅鋬?yōu)勢所在,就像后文所討論的,面向?qū)ο蟠a有著非面向?qū)ο蟠a的很多優(yōu)勢,而軟件業(yè)中很多新的思潮的產(chǎn)生,也都是基于面向?qū)ο笳Z言的,所以我們關(guān)注的代碼將是面向?qū)ο蟠a。
編寫優(yōu)秀的面向?qū)ο蟠a并不是一件容易的事情,優(yōu)秀的
OO
代碼如行云流水,糟糕的
OO
代碼讓人覺得渾身起雞皮疙瘩。編寫優(yōu)秀的
OO
代碼要求程序員有一定的自我修養(yǎng),能夠以抽象的思路看待問題,找到問題的核心并對問題域進行分解。它強調(diào)的是一種解題的思路,但這個解不是唯一的。
編寫優(yōu)秀
OO
代碼雖難,但還有更難的事情,就是讓整個開發(fā)團隊都產(chǎn)出優(yōu)秀的
OO
代碼。
?
B
面向?qū)ο筌浖_發(fā)過程
普通的軟件開發(fā)過程和面向?qū)ο箝_發(fā)過程有著很大的不同。回想我們在非面向?qū)ο笾虚_發(fā)過程中,最經(jīng)常采用的任務(wù)分配方法就是以軟件模塊為單位,這樣的好處是分配簡單,不同任務(wù)之間耦合程度低,容易操作。壞處是幾乎無法做到重用,也缺乏整體性的設(shè)計。而面向?qū)ο筌浖_發(fā)則不同,它是以類、類集合作為基本單位的。類之間關(guān)系錯綜復雜(雖然我們提倡低耦合的設(shè)計,但類之間的關(guān)系仍然是相對復雜的)。這種情況下程序員之間相互協(xié)作的要求就非常之高,這種關(guān)系如果處理恰當,則能夠完全體現(xiàn)出面向?qū)ο蟮耐Γ駝t,那將會是一場大災難,面向?qū)ο蟮能浖_發(fā)過程要養(yǎng)成一些好的習慣:盡量簡化和穩(wěn)定客戶端。準備一份簡潔的文檔,并保持更新。盡可能多的考慮異常和錯誤的情況。
?
C
基于面向?qū)ο蟠a的分析框架
在一個開發(fā)過程中,往往有著多種復雜的因素:過程、技能、工具、規(guī)范、組織、個性。所有的這些,都會對最終的代碼產(chǎn)生影響,對代碼的成本和質(zhì)量產(chǎn)生影響。軟件最有價值的部分是代碼,根據(jù)敏捷方法和精益編程的思路,除了代碼之外的產(chǎn)出物,都不具有價值,或者說對最終用戶沒有價值。但它們都需要成本的投入,而我們應該考慮如何節(jié)省這些成本。
?
?
4
、應用框架
框架不是框框—應用框架的基本思想
軟件構(gòu)件化是
21
世紀軟件工業(yè)發(fā)展的大勢趨。工業(yè)化的軟件復用已經(jīng)從通用類庫進化到了面向領(lǐng)域的應用框架。
Gartner Group
認為:“到
2003
年,至少
70%
的新應用將主要建立在如軟件構(gòu)件和應用框架這類‘構(gòu)造塊’之上;應用開發(fā)的未來就在于提供一開放體系結(jié)構(gòu),以方便構(gòu)件的選擇、組裝和集成”。框架的重用已成為軟件生產(chǎn)中最有效的重用方式之一。
什么是框架?
框架(
Framework
)是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實例間交互的方法
;
另一種定義認為,框架是可被應用開發(fā)者定制的應用骨架。前者是從應用方面而后者是從目的方面給出的定義。
可以說,一個框架是一個可復用的設(shè)計構(gòu)件,它規(guī)定了應用的體系結(jié)構(gòu),闡明了整個設(shè)計、協(xié)作構(gòu)件之間的依賴關(guān)系、責任分配和控制流程,表現(xiàn)為一組抽象類以及其實例之間協(xié)作的方法,它為構(gòu)件復用提供了上下文
(Context)
關(guān)系。因此構(gòu)件庫的大規(guī)模重用也需要框架。
框架和設(shè)計模式
框架、設(shè)計模式這兩個概念總?cè)菀妆换煜鋵嵥鼈冎g還是有區(qū)別的。構(gòu)件通常是代碼重用,而設(shè)計模式是設(shè)計重用,框架則介于兩者之間,部分代碼重用,部分設(shè)計重用,有時分析也可重用。在軟件生產(chǎn)中有三種級別的重用:內(nèi)部重用,即在同一應用中能公共使用的抽象塊
;
代碼重用,即將通用模塊組合成庫或工具集,以便在多個應用和領(lǐng)域都能使用;應用框架的重用,即為專用領(lǐng)域提供通用的或現(xiàn)成的基礎(chǔ)結(jié)構(gòu),以獲得最高級別的重用性。
為什么要進行框架開發(fā)
?
框架的最大好處就是重用。面向?qū)ο笙到y(tǒng)獲得的最大的復用方式就是框架,一個大的應用系統(tǒng)往往可能由多層互相協(xié)作的框架組成。
由于框架能重用代碼,因此從一已有構(gòu)件庫中建立應用變得非常容易,因為構(gòu)件都采用框架統(tǒng)一定義的接口,從而使構(gòu)件間的通信簡單。
框架能重用設(shè)計。它提供可重用的抽象算法及高層設(shè)計,并能將大系統(tǒng)分解成更小的構(gòu)件,而且能描述構(gòu)件間的內(nèi)部接口。這些標準接口使在已有的構(gòu)件基礎(chǔ)上通過組裝建立各種各樣的系統(tǒng)成為可能。只要符合接口定義,新的構(gòu)件就能插入框架中,構(gòu)件設(shè)計者就能重用構(gòu)架的設(shè)計。
框架還能重用分析。所有的人員若按照框架的思想來分析事務(wù),那么就能將它劃分為同樣的構(gòu)件,采用相似的解決方法,從而使采用同一框架的分析人員之間能進行溝通。
有利于在一個項目內(nèi)多人協(xié)同工作;
大粒度的重用使得平均開發(fā)費用降低,開發(fā)速度加快,開發(fā)人員減少,維護費用降低,而參數(shù)化框架使得適應性、靈活性增強。
框架能使應用程序的開發(fā)簡單,價格低廉,但是開發(fā)框架不是一件容易的事。它是一個需要領(lǐng)域和設(shè)計經(jīng)驗的反復過程。為了保證框架的靈活性,必須提取和發(fā)現(xiàn)熱點。設(shè)計模式可以簡化這個過程,因為它提供了對過去經(jīng)驗的抽象。應用框架能高度抽象同一領(lǐng)域內(nèi)的問題,進而降低開發(fā)難度和強度。雖然框架和構(gòu)件技術(shù)已經(jīng)出現(xiàn)許多年了,開始走入實用
,
但還不成熟,有大量問題有待研究。
?
?
5
、模塊化和構(gòu)件化設(shè)計
?
?
?
6
、概要設(shè)計怎么做
在需求明確、準備開始編碼之前,要做概要設(shè)計,而詳細設(shè)計可能大部分公司沒有做,有做的也大部分是和編碼同步進行,或者在編碼之后。因此,對大部分的公司來說,概要設(shè)計文檔是唯一的設(shè)計文檔,對后面的開發(fā)、測試、實施、維護工作起到關(guān)鍵性的影響。
大的系統(tǒng)的概要設(shè)計相當于架構(gòu)設(shè)計和初步的系統(tǒng)設(shè)計。
?
概要設(shè)計的目的(架構(gòu)設(shè)計)
將軟件系統(tǒng)需求轉(zhuǎn)換為未來系統(tǒng)的設(shè)計;
逐步開發(fā)強壯的系統(tǒng)構(gòu)架;
使設(shè)計適合于實施環(huán)境,為提高性能而進行設(shè)計;
結(jié)構(gòu)應該被分解為模塊和庫。
概要設(shè)計的任務(wù)
制定規(guī)范:代碼體系、接口規(guī)約、命名規(guī)則。這是項目小組今后共同作戰(zhàn)的基礎(chǔ),有了開發(fā)規(guī)范和程序模塊之間和項目成員彼此之間的接口規(guī)則、方式方法,大家就有了共同的工作語言、共同的工作平臺,使整個軟件開發(fā)工作可以協(xié)調(diào)有序地進行。
總體結(jié)構(gòu)設(shè)計:
?
功能(加工)-
>
模塊:每個功能用那些模塊實現(xiàn),保證每個功能都有相應的模塊來實現(xiàn);
?
模塊層次結(jié)構(gòu):某個角度的軟件框架視圖;
?
模塊間的調(diào)用關(guān)系:模塊間的接口的總體描述;
?
模塊間的接口:傳遞的信息及其結(jié)構(gòu);
?
處理方式設(shè)計:滿足功能和性能的算法
?
用戶界面設(shè)計;
?
數(shù)據(jù)結(jié)構(gòu)設(shè)計:
?
詳細的數(shù)據(jù)結(jié)構(gòu):表、索引、文件;
?
算法相關(guān)邏輯數(shù)據(jù)結(jié)構(gòu)及其操作;
?
上述操作的程序模塊說明(在前臺?在后臺?用視圖?用過程?······)
?
接口控制表的數(shù)據(jù)結(jié)構(gòu)和使用規(guī)則
?
其他性能設(shè)計。
概要設(shè)計寫什么
?
結(jié)構(gòu)化軟件設(shè)計說明書結(jié)構(gòu)(因篇幅有限和過時嫌疑,在此不作過多解釋)
?
任務(wù):目標、環(huán)境、需求、局限;
?
總體設(shè)計:處理流程、總體結(jié)構(gòu)與模塊、功能與模塊的關(guān)系;
?
接口設(shè)計:總體說明外部用戶、軟、硬件接口;內(nèi)部模塊間接口(注:接口≈系統(tǒng)界面)
?
數(shù)據(jù)結(jié)構(gòu):邏輯結(jié)構(gòu)、物理結(jié)構(gòu),與程序結(jié)構(gòu)的關(guān)系;
?
模塊設(shè)計:每個模塊“做什么”、簡要說明“怎么做”(輸入、輸出、處理邏輯、與其它模塊的接口,與其它系統(tǒng)或硬件的接口),處在什么邏輯位置、物理位置;
?
運行設(shè)計:運行模塊組合、控制、時間;
?
出錯設(shè)計:出錯信息、處錯處理;
?
其他設(shè)計:保密、維護;
?
7
、代碼規(guī)范和注釋規(guī)范
?
?
?
8
、單元測試和測試案例
?
?
9
、團隊協(xié)作及大中規(guī)模軟件開發(fā)過程
大規(guī)模軟件需要團隊合作開發(fā)。
?
第一步:需求分析,產(chǎn)出
Use-Case
用例圖
第二步:概要設(shè)計,產(chǎn)出概要設(shè)計文檔(模塊設(shè)計和代碼規(guī)范等)
第三步:架構(gòu)設(shè)計,產(chǎn)出模塊化設(shè)計,功能設(shè)計,接口設(shè)計,模塊協(xié)作圖等圖及文檔
第四步:系統(tǒng)設(shè)計,產(chǎn)出
Sequence
序列圖,功能流程程圖
第五步:詳細設(shè)計,產(chǎn)出
Class
類圖,偽代碼設(shè)計,測試案例等
第六步:代碼開發(fā)及單元測試
第七步:壓力測試和整體聯(lián)調(diào)測試
第八步:完成后續(xù)文檔和維護文檔等
?
?
?
10
、面向?qū)ο笤O(shè)計原則
The OpenThe Open--Closed PrincipleClosed Principle
任何系統(tǒng)在其生命周期中都會發(fā)生變化。如果我們希望開發(fā)出的系統(tǒng)不會在第一版本后就被拋棄,那么我們就必須牢牢記住這一點。
軟件組成實體(類,模塊,函數(shù),等等)應該是可擴展的,但是不可修改的。
?
OCP OCP
特征
1
、可擴展(對擴展是開放的)
模塊的行為功能可以被擴展,在應用需求改變或需要滿足新的應用需求時,我們可以讓模塊以不同的方式工作
2
、不可更改(對更改是封閉的)
這些模塊的源代碼是不可改動的。任何人都不許修改模塊的源代碼。
?
關(guān)鍵是抽象!
模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體,因此它可以是不允許修改(
closed for modification
)的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。
符合
OCP
原則的程序只通過增加代碼來變化而不是通過更改現(xiàn)有代碼來變化,因此這樣的程序就不會引起象非開放―封閉(
open-closed
)的程序那樣的連鎖反應的變化。
?
對可變性的封裝
考慮系統(tǒng)中什么可能會發(fā)生變化
一種可變性不應當散落在代碼的很多角落里,而應當被封裝到一個對象里
?
正確理解繼承
一種可變性不應當與另一個可變性混合在一起
?
選擇性的封閉(
Strategic Closure
)沒有任何一個大的程序能夠做到
100%
的封閉。一般來講,無論模塊是多么的“封閉”,都會存在一些無法對之封閉的變化。既然不可能完全封閉,因此就必須選擇性地對待這個問題。也就是說,設(shè)計者必須對于他(她)設(shè)計的模塊應該對何種變化封閉做出選擇。
?
?
Liskov
替換原則替換原則
LSP The The Liskov Substitution Principle
OCP
原則背后的主要機制是抽象和多態(tài)。支持抽象和多態(tài)的關(guān)鍵機制是繼承。
?
LSP
的定義
若對于每一個類型
S
的對象
o1
,都存在一個類型
T
的對象
o2
,使得在所有針對
T
編寫的程序
P
中,用
o1
替換
o2
后,程序
P
的行為功能不變,則
S
是
T
的子類型。
LSP
原則清楚地指出,
OOD
中
Is-A
關(guān)系是就行為功能而言。行為功能(
behavior
)不是內(nèi)在的、私有的,而是外在、公開的,是客戶程序所依賴的。行為功能(
behavior
)才是軟件所關(guān)注的問題!所有派生類的行為功能必須和客戶程序?qū)ζ浠愃谕谋3忠恢隆?/span>
?
LSP
和
DBC
DBC
(
Design by Contract
)定義把類和其客戶之間的關(guān)系看作是一個正式的協(xié)議,明確各方的權(quán)利和義務(wù)。
DBC
對類的要求類的方法聲明為先決條件(
precondition
)和后續(xù)條件(
postcondition
)。為了讓方法得以執(zhí)行,先決條件必須為真。完成后,方法保證后續(xù)條件為真。
DBC
對派生類的要求當重新定義派生類中的例行程序時,我們只能用更弱的先決條件和更強的后續(xù)條件替換之。
?
LSP
-結(jié)論
LSP
原則是符合
OCP
原則應用程序的一項重要特性。僅當派生類能完全替換基類時,我們才能放心地重用那些使用基類的函數(shù)和修改派生類型。
高層模塊不應該依賴于低層模塊。二者都應該依賴于抽象。
抽象不應該依賴于細節(jié)。細節(jié)應該依賴于抽象。
實施重點
從問題的具體細節(jié)中分離出抽象,以抽象方式對類進行耦合
不足
導致生成大量的類
假定所有的具體類都是會變化的,這也不總是正確的
DIP
與設(shè)計模式
DIP
以
LSP
為基礎(chǔ),是實現(xiàn)
OCP
的主要手段,是設(shè)計模式研究和應用的主要指導原則
接口隔離原則(
ISP
)恰當?shù)膭澐纸巧徒涌?/font>
接口的污染(
Interface Contamination
)一個沒有經(jīng)驗的設(shè)計師往往想節(jié)省接口的數(shù)目,將一些功能相近或功能相關(guān)的接口合并,并將這看成是代碼優(yōu)化的一部分。
定義:從一個客戶類的角度來講:一個類對另外一個類的依賴性應當是建立在最小的接口上的。使用多個專門的接口比使用單一的總接口要好。
合成
/
聚合復用原則(
CARP
)盡量使用合成
/
聚合、盡量不使用繼承
定義:在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達到復用這些對象的目的。
?
?
11
、設(shè)計模式
在面向?qū)ο蟮木幊讨校浖幊倘藛T更加注重以前的代碼的重用性和可維護性。
設(shè)計模式使人們可以更加簡單方便地復用成功的設(shè)計和體系結(jié)構(gòu)。將已證實的技術(shù)表述成設(shè)計模式也會使新系統(tǒng)開發(fā)者更加容易理解其設(shè)計思路。
?
一般而言,一個模式有四個基本要素
1.
模式名稱(
pattern name
)
一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。命名一個新的模式增加了我們的設(shè)計詞匯。設(shè)計模式允許我們在較高的抽象層次上進行設(shè)計。基于一個模式詞匯表,我們自己以及同事之間就可以討論模式并在編寫文檔時使用它們。模式名可以幫助我們思考,便于我們與其他人交流設(shè)計思想及設(shè)計結(jié)果。找到恰當?shù)哪J矫彩俏覀冊O(shè)計模式編目工作的難點之一。
2.
問題
(problem)
描述了應該在何時使用模式。它解釋了設(shè)計問題和問題存在的前因后果,它可能描述了特定的設(shè)計問題,如怎樣用對象表示算法等。也可能描述了導致不靈活設(shè)計的類或?qū)ο蠼Y(jié)構(gòu)。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。
3.
解決方案
(solution)
描述了設(shè)計的組成成分,它們之間的相互關(guān)系及各自的職責和協(xié)作方式。因為模式就像一個模板,可應用于多種不同場合,所以解決方案并不描述一個特定而具體的設(shè)計或?qū)崿F(xiàn),而是提供設(shè)計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或?qū)ο蠼M合)來解決這個問題。
4.
效果
(consequences)
描述了模式應用的效果及使用模式應權(quán)衡的問題。盡管我們描述設(shè)計決策時,并不總提到模式效果,但它們對于評價設(shè)計選擇和理解使用模式的代價及好處具有重要意義。軟件效果大多關(guān)注對時間和空間的衡量,它們也表述了語言和實現(xiàn)問題。因為復用是面向?qū)ο笤O(shè)計的要素之一,所以模式效果包括它對系統(tǒng)的靈活性、擴充性或可移植性的影響,顯式地列出這些效果對理解和評價這些模式很有幫助。
?
一些基本的設(shè)計模式
Abstract Factory
:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類。
Adapter
:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。
A d a p t e r
模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
Bridge
:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。
Builder
:將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
Chain of Responsibility
:為解除請求的發(fā)送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。
Command
:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可取消的操作。
Composite
:將對象組合成樹形結(jié)構(gòu)以表示“部分
-
整體”的層次結(jié)構(gòu)。它使得客戶對單個對象和復合對象的使用具有一致性。
Decorator
:動態(tài)地給一個對象添加一些額外的職責。就擴展功能而言,
它比生成子類方式更為靈活。
Facade
:為子系統(tǒng)中的一組接口提供一個一致的界面,
F a c a d e
模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
Factory Method
:定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。
Factory Method
使一個類的實例化延遲到其子類。
Flyweight
:運用共享技術(shù)有效地支持大量細粒度的對象。
Interpreter
:給定一個語言
,
定義它的文法的一種表示,并定義一個解釋器
,
該解釋器使用該表示來解釋語言中的句子。
Iterator
:提供一種方法順序訪問一個聚合對象中各個元素
,
而又不需暴露該對象的內(nèi)部表示。
Mediator
:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
Memento
:在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到保存的狀態(tài)。
Observer
:定義對象間的一種一對多的依賴關(guān)系
,
以便當一個對象的狀態(tài)發(fā)生改變時
,
所有依賴于它的對象都得到通知并自動刷新。
Prototype
:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這個原型來創(chuàng)建新的對象。
Proxy
:為其他對象提供一個代理以控制對這個對象的訪問。
Singleton
:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
State
:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它所屬的類。
Strategy
:定義一系列的算法
,
把它們一個個封裝起來
,
并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客戶。
Template Method
:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
Template Method
使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
Visitor
:表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
?
?
12
、經(jīng)驗談
1
、不迷信于某篇文章或某人或某一個理論,理解和領(lǐng)悟勝于死搬硬套,靈活運用
2
、用抽象的思維代替程序化的思維,找出事物的共性,分離出抽象的接口,可以不變應萬變,適應不同的需求。
3
、用對象代替數(shù)據(jù),用成員方法代替函數(shù)來思考問題,設(shè)計系統(tǒng)。
4
、代碼要規(guī)范,注釋要規(guī)范。比如頭文件的包含關(guān)系,類型定義、聲明和實現(xiàn)的位置等,都需要有規(guī)范的統(tǒng)一。
5
、學會拿來主義,從別的優(yōu)秀的系統(tǒng)中吸取自己想要的東西,而不是自己照搬照抄或者全部從零構(gòu)建系統(tǒng)。
6
、框架是代碼的復用,設(shè)計模式是設(shè)計的復用,面向?qū)ο笫窃O(shè)計的方法,
UML
是設(shè)計的工具,
RUP
是軟件開發(fā)的過程。
?
?
?
?
作者:naven? 2005-5-10
參考文獻:
1
、
www.uml.org.cn
、
2
、《
UML
:
Java
程序員指南》
?