設(shè)計模式淺談(24種).ppt_第1頁
設(shè)計模式淺談(24種).ppt_第2頁
設(shè)計模式淺談(24種).ppt_第3頁
設(shè)計模式淺談(24種).ppt_第4頁
設(shè)計模式淺談(24種).ppt_第5頁
已閱讀5頁,還剩135頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

設(shè)計模式DesignPatterns 準(zhǔn)備 理解面向?qū)ο笤O(shè)計的原則 開放 封閉原則 是說軟件實體 類 模塊 函數(shù)等等 應(yīng)該可以擴(kuò)展 但是不可修改 里氏代換原則 子類型必須能夠替換掉它們的父類型 依賴倒轉(zhuǎn)原則 A 高層模塊不應(yīng)該依賴低層模塊 兩個都應(yīng)該依賴抽象 B 抽象不應(yīng)該依賴細(xì)節(jié) 細(xì)節(jié)應(yīng)該依賴抽象 請參考 面向?qū)ο笤O(shè)計的原則 2 概述 導(dǎo)致重新設(shè)計的一般原因通過顯式指定一個類來創(chuàng)建對象對特殊操作的依賴對硬件和軟件平臺的依賴對對象表示和實現(xiàn)的依賴對算法的依賴緊耦合通過生成子類來擴(kuò)充功能不能方便地對類進(jìn)行修改 3 概述 4 原則一 對接口編程 而不是對實現(xiàn)編程 原則二 優(yōu)先使用對象組合 而不是繼承 概述 什么是設(shè)計模式設(shè)計模式是對被用來在特定場景下解決一般設(shè)計問題的類和相互通信的對象的描述 每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題 以及該問題的解決方案的核心 這樣 你就能一次又一次地使用該方案而不必做重復(fù)勞動 設(shè)計模式的內(nèi)容模式名稱Patternname問題Problem解決方案Solution效果Consequences 5 概述 設(shè)計模式編目 設(shè)計模式之間的關(guān)系 7 創(chuàng)建型模式 創(chuàng)建型模式的目的使系統(tǒng)獨(dú)立于如何創(chuàng)建 組合和表示對象 類創(chuàng)建型模式使用繼承改變被實例化的類 對象創(chuàng)建型模式將實例化委托給另一個對象 8 AbstractFactory Builder FactoryMethod Prototype Singleton 創(chuàng)建型模式 三種Factory模式 SimpleFactory 簡單工廠 模式 專門定義一個類來負(fù)責(zé)創(chuàng)建其它類的實例 被創(chuàng)建的實例通常都具有共同的父類 FactoryMethod 工廠方法 模式 將對象的創(chuàng)建交由父類中定義的一個標(biāo)準(zhǔn)方法來完成 而不是其構(gòu)造函數(shù) 究竟應(yīng)該創(chuàng)建何種對象由具體的子類負(fù)責(zé)決定 AbstractFactory 抽象工廠 模式 提供一個共同的接口來創(chuàng)建相互關(guān)聯(lián)的多個對象 9 創(chuàng)建型模式 FactoryMethod 工廠方法 類創(chuàng)建型模式意圖定義一個用于創(chuàng)建對象的接口 讓子類決定實例化哪一個類 FactoryMethod使一個類的實例化延遲到其子類 適用性當(dāng)一個類不知道它所必須創(chuàng)建的對象的類的時候 當(dāng)一個類希望由它的子類來指定它所創(chuàng)建的對象的時候 當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個幫助子類中的某一個 并且你希望將哪一個幫助子類是代理者這一信息局部化的時候 10 創(chuàng)建型模式 FactoryMethod 工廠方法 11 創(chuàng)建型模式 FactoryMethod 工廠方法 效果用工廠方法在類中創(chuàng)建對象比直接創(chuàng)建更靈活 子類可以提供對象的擴(kuò)展版本 連接平行的類層次 將哪些類應(yīng)一同工作的信息局部化 實現(xiàn)Creator可以只聲明工廠方法 也可以提供缺省的實現(xiàn) 可以使用模板以避免創(chuàng)建子類 可采用適當(dāng)?shù)拿s定說明正在使用工廠方法 12 創(chuàng)建型模式 AbstractFactory 抽象工廠 對象創(chuàng)建型模式意圖提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口 而無需指定它們具體的類 適用性一個系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建 組合和表示時 一個系統(tǒng)要用多個產(chǎn)品系列中的一個來配置時 要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進(jìn)行聯(lián)合使用時 提供一個產(chǎn)品類庫 而只想顯示它們的接口而不是實現(xiàn)時 13 創(chuàng)建型模式 AbstractFactory 抽象工廠 14 創(chuàng)建型模式 15 創(chuàng)建型模式 AbstractFactory 抽象工廠 效果由工廠封裝產(chǎn)品對象的創(chuàng)建 將客戶與類的實現(xiàn)分離 易于交換產(chǎn)品系列 有利于產(chǎn)品的一致性 難以支持新種類的產(chǎn)品 實現(xiàn)通常可以將工廠作為Singleton AbstractFactory聲明創(chuàng)建產(chǎn)品的接口 由工廠子類負(fù)責(zé)創(chuàng)建產(chǎn)品 通常為每個產(chǎn)品定義一個工廠方法 一種更靈活但不太安全的設(shè)計是以參數(shù)方式創(chuàng)建對象 16 創(chuàng)建型模式 Builder 生成器 對象創(chuàng)建型模式意圖將一個復(fù)雜對象的構(gòu)建與它的表示分離 使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 適用性當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時 當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時 17 創(chuàng)建型模式 Builder 生成器 18 創(chuàng)建型模式 四個角色 建造者 Builder 角色 給出一個抽象接口 以規(guī)范產(chǎn)品對象的各個組成成分的建造 一般而言 此接口獨(dú)立于應(yīng)用程序的商業(yè)邏輯 模式中直接創(chuàng)建產(chǎn)品對象的是具體建造者 ConcreteBuilder 角色 具體建造者類必須實現(xiàn)這個接口所要求的方法 一個是建造方法 另一個是結(jié)果返還方法 具體建造者 ConcreteBuilder 角色 擔(dān)任這個角色的是于應(yīng)用程序緊密相關(guān)的類 它們在應(yīng)用程序調(diào)用下創(chuàng)建產(chǎn)品實例 這個角色主要完成的任務(wù)包括 實現(xiàn)Builder角色提供的接口 一步一步完成創(chuàng)建產(chǎn)品實例的過程 在建造過程完成后 提供產(chǎn)品的實例 19 創(chuàng)建型模式 指導(dǎo)者 Director 角色 擔(dān)任這個角色的類調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對象 導(dǎo)演者并沒有產(chǎn)品類的具體知識 真正擁有產(chǎn)品類的具體知識的是具體建造者對象 產(chǎn)品 Product 角色 產(chǎn)品便是建造中的復(fù)雜對象 指導(dǎo)者角色是于客戶端打交道的角色 導(dǎo)演者角色將客戶端創(chuàng)建產(chǎn)品的請求劃分為對各個零件的建造請求 再將這些請求委派給具體建造者角色 具體建造者角色是做具體建造工作的 但卻不為客戶端所知 20 創(chuàng)建型模式 Builder 生成器 21 classBuilder 創(chuàng)建部件A比如創(chuàng)建汽車車輪voidbuildPartA 創(chuàng)建部件B比如創(chuàng)建汽車方向盤voidbuildPartB 創(chuàng)建部件C比如創(chuàng)建汽車發(fā)動機(jī)voidbuildPartC 返回最后組裝成品結(jié)果 返回最后裝配好的汽車 成品的組裝過程不在這里進(jìn)行 而是轉(zhuǎn)移到下面的Director類中進(jìn)行 從而實現(xiàn)了解耦過程和部件Product getResult classDirector privateBuilder m builder publicDirector Builder builder m builder builder 將部件partApartBpartC最后組成復(fù)雜對象 這里是將車輪方向盤和發(fā)動機(jī)組裝成汽車的過程publicvoidconstruct builder buildPartA builder buildPartB builder buildPartC classConcreteBuilder publicBuilder PartpartA partB partC public voidbuildPartA 這里是具體如何構(gòu)建partA的代碼 voidbuildPartB 這里是具體如何構(gòu)建partB的代碼 voidbuildPartC 這里是具體如何構(gòu)建partB的代碼 Product getResult 返回最后組裝成品結(jié)果 ConcreteBuilderbuilder Directordirector 創(chuàng)建型模式 Builder 生成器 效果可以改變一個產(chǎn)品的內(nèi)部表示 將構(gòu)造代碼和表示代碼分開 可以對構(gòu)造過程進(jìn)行更精細(xì)的控制 實現(xiàn)Builder類接口應(yīng)足夠普遍 產(chǎn)品通常不需要有公共抽象類 Builder中通常缺省方法為空 22 創(chuàng)建型模式 Prototype 原型 對象創(chuàng)建型模式意圖用原型實例指定創(chuàng)建對象的種類 并且通過拷貝這些原型創(chuàng)建新的對象 適用性當(dāng)要實例化的類是在運(yùn)行時刻指定時 例如 通過動態(tài)裝載 或者為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時 或者當(dāng)一個類的實例只能有幾個不同狀態(tài)組合中的一種時 建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些 23 創(chuàng)建型模式 Prototype 原型 24 創(chuàng)建型模式 客戶 Client 角色 客戶類提出創(chuàng)建對象的請求 抽象原型 Prototype 角色 這是一個抽象角色 通常由一個接口或抽象類實現(xiàn) 此角色給出所有的具體原型類所需的接口 具體原型 ConcretePrototype 角色 被復(fù)制的對象 此角色需要實現(xiàn)抽象原型角色所要求的接口 25 創(chuàng)建型模式 Prototype 原型 效果可在運(yùn)行時刻增加和刪除產(chǎn)品 可以通過改變值來指定新產(chǎn)品 可以通過改變結(jié)構(gòu)來指定新對象 減少了子類的構(gòu)造 可以用類動態(tài)配置應(yīng)用 實現(xiàn)使用一個原型管理器 實現(xiàn)克隆操作 淺拷貝和深拷貝 初始化克隆對象 參考閻宏的 JAVA模式 26 創(chuàng)建型模式 Singleton 單件 對象創(chuàng)建型模式意圖保證一個類僅有一個實例 并提供一個訪問它的全局訪問點(diǎn) 適用性當(dāng)類只能有一個實例而且客戶可以從一個眾所周知的訪問點(diǎn)訪問它時 當(dāng)這個唯一實例應(yīng)該是通過子類化可擴(kuò)展的 并且客戶應(yīng)該無需更改代碼就能使用一個擴(kuò)展的實例時 27 創(chuàng)建型模式 Singleton 單件 28 實例詳解 結(jié)構(gòu)型模式 結(jié)構(gòu)型模式的目的結(jié)構(gòu)型模式涉及到如何組合類和對象以獲得更大的結(jié)構(gòu) 結(jié)構(gòu)型類模式采用繼承機(jī)制來組合接口或?qū)崿F(xiàn) 結(jié)構(gòu)型對象模式描述了如何對一些對象進(jìn)行組合實現(xiàn)新功能 并可以在運(yùn)行時刻改變對象組合關(guān)系的一些方法 29 Adapter Bridge Composite Decorator Facade Flyweight Proxy 結(jié)構(gòu)型模式 Adapter 適配器 類 對象結(jié)構(gòu)型模式意圖將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口 使得原本由于接口不兼容而不能一起工作的那些類可以一起工作 適用性你想使用一個已經(jīng)存在的類 而它的接口不符合你的需求 你想創(chuàng)建一個可以復(fù)用的類 該類可以與其他不相關(guān)的類或不可預(yù)見的類 即那些接口可能不一定兼容的類 協(xié)同工作 僅適用于對象Adapter 你想使用一些已經(jīng)存在的子類 但是不可能對每一個都進(jìn)行子類化以匹配它們的接口 對象適配器可以適配它的父類接口 30 結(jié)構(gòu)型模式 角色 目標(biāo) Target 角色 這是客戶所期待的接口 因為C 不支持多繼承 所以Target必須是接口 不可以是類 源 Adaptee 角色 需要適配的類 適配器 Adapter 角色 把源接口轉(zhuǎn)換成目標(biāo)接口 根據(jù)這一角色的實現(xiàn)不同 可分為類適配器和對象適配器 31 結(jié)構(gòu)型模式 Adapter 類適配器 類適配器是通過繼承類適配者類 AdapteeClass 實現(xiàn)的 另外類適配器實現(xiàn)客戶類所需要的接口 當(dāng)客戶對象調(diào)用適配器類方法的時候 適配器內(nèi)部調(diào)用它所繼承的適配者的方法 32 結(jié)構(gòu)型模式 Adapter 對象適配器 對象適配器包含一個適配器者的引用 reference 與類適配器相同 對象適配器也實現(xiàn)了客戶類需要的接口 當(dāng)客戶對象調(diào)用對象適配器的方法的時候 對象適配器調(diào)它所包含的適配器者實例的適當(dāng)方法 33 實例詳解 結(jié)構(gòu)型模式 Bridge 橋接 對象結(jié)構(gòu)型模式意圖將抽象部分與它的實現(xiàn)部分分離 使它們都可以獨(dú)立地變化 通過動態(tài)的結(jié)合實現(xiàn)解耦 GOF 比如說通過JDBC訪問數(shù)據(jù)庫 我們操作的API是基于接口的 是抽象 沒有實現(xiàn) 而特定數(shù)據(jù)庫提供的驅(qū)動測試抽象方法的具體實現(xiàn) 適用性 34 結(jié)構(gòu)型模式 Bridge 橋接 對象結(jié)構(gòu)型模式意圖適用性不希望在抽象和它的實現(xiàn)部分之間有一個固定的綁定關(guān)系 類的抽象以及它的實現(xiàn)都應(yīng)該可以通過生成子類的方法加以擴(kuò)充 對一個抽象的實現(xiàn)部分的修改應(yīng)對客戶不產(chǎn)生影響 即客戶的代碼不必重新編譯 你想對客戶完全隱藏抽象的實現(xiàn)部分 有許多子類要生成 這樣一種類層次結(jié)構(gòu)說明你必須將一個對象分解成兩個部分 你想在多個對象間共享實現(xiàn) 可能使用引用計數(shù) 但同時要求客戶并不知道這一點(diǎn) 35 結(jié)構(gòu)型模式 Bridge 橋接 36 結(jié)構(gòu)型模式 角色 抽象化 Abstraction 角色 抽象化給出的定義 并保存一個對實現(xiàn)化對象的引用 修正抽象化 RefinedAbstraction 角色 擴(kuò)展抽象化角色 改變和修正父類對抽象化的定義 實現(xiàn)化 Implementor 角色 這個角色給出實現(xiàn)化角色的接口 但不給出具體的實現(xiàn) 必須指出的是 這個接口不一定和抽象化角色的接口定義相同 實際上 這兩個接口可以非常不一樣 實現(xiàn)化角色應(yīng)當(dāng)只給出底層操作 而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作 具體實現(xiàn)化 ConcreteImplementor 角色 這個角色給出實現(xiàn)化角色接口的具體實現(xiàn) 37 結(jié)構(gòu)型模式 Bridge 橋接 效果分離了接口及其實現(xiàn)部分 提高了可擴(kuò)充性 實現(xiàn)了細(xì)節(jié)對客戶透明 實現(xiàn)當(dāng)僅有一個Implementor時不須創(chuàng)建抽象Implementor 如何創(chuàng)建正確的Implementor對象 共享Implementor對象 38 結(jié)構(gòu)型模式 Composite 組合 對象結(jié)構(gòu)型模式意圖將對象組合成樹形結(jié)構(gòu)以表示 部分 整體 的層次結(jié)構(gòu) Composite使得用戶對單個對象和組合對象的使用具有一致性 適用性你想表示對象的部分 整體層次結(jié)構(gòu) 你希望用戶忽略組合對象與單個對象的不同 用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象 2014年9月29日22時40分 39 結(jié)構(gòu)型模式 Composite 組合 40 結(jié)構(gòu)型模式 角色 抽象構(gòu)件 Component 角色 這是一個抽象角色 它給參與組合的對象規(guī)定一個接口 這個角色給出共有接口及其默認(rèn)行為 樹葉構(gòu)件 Leaf 角色 代表參加組合的樹葉對象 一個樹葉對象沒有下級子對象 樹枝構(gòu)件 Composite 角色 代表參加組合的有子對象的對象 并給出樹枝構(gòu)件對象的行為 可以看出 Composite類型的對象可以包含其它Component類型的對象 換而言之 Composite類型對象可以含有其它的樹枝 Composite 類型或樹葉 Leaf 類型的對象 41 結(jié)構(gòu)型模式 Decorator 裝飾 又名包裝 Wrapper 模式對象結(jié)構(gòu)型模式意圖動態(tài)地給一個對象添加一些額外的職責(zé) 就增加功能來說 Decorator模式相比生成子類更為靈活 適用性 42 結(jié)構(gòu)型模式 Decorator 裝飾 對象結(jié)構(gòu)型模式意圖適用性在不影響其他對象的情況下 以動態(tài) 透明的方式給單個對象添加職責(zé) 處理那些可以撤消的職責(zé) 當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時 一種情況是 可能有大量獨(dú)立的擴(kuò)展 為支持每一種組合將產(chǎn)生大量的子類 使得子類數(shù)目呈爆炸性增長 另一種情況可能是因為類定義被隱藏 或類定義不能用于生成子類 43 結(jié)構(gòu)型模式 Decorator 裝飾 44 結(jié)構(gòu)型模式 角色有 抽象構(gòu)件 Component 角色 給出一個抽象接口 以規(guī)范準(zhǔn)備接收附加責(zé)任的對象 具體構(gòu)件 ConcreteComponent 角色 定義一個將要接收附加責(zé)任的類 裝飾 Decorator 角色 持有一個構(gòu)件 Component 對象的實例 并定義一個與抽象構(gòu)件接口一致的接口 具體裝飾 ConcreteDecorator 角色 負(fù)責(zé)給構(gòu)件對象 貼上 附加的責(zé)任 45 結(jié)構(gòu)型模式 孫悟空有七十二般變化 他的每一種變化都給他帶來一種附加的本領(lǐng) 他變成魚兒時 就可以到水里游泳 他變成雀兒時 就可以在天上飛行 而不管悟空怎么變化 在二郎神眼里 他永遠(yuǎn)是那只猢猻 裝飾模式以對客戶透明的方式動態(tài)地給一個對象附加上更多的責(zé)任 換言之 客戶端并不會覺得對象在裝飾前和裝飾后有什么不同 裝飾模式可以在不使用創(chuàng)造更多子類的情況下 將對象的功能加以擴(kuò)展 46 結(jié)構(gòu)型模式 裝飾模式使用原來被裝飾的類的一個子類的實例 把客戶端的調(diào)用委派到被裝飾類 裝飾模式的關(guān)鍵在于這種擴(kuò)展是完全透明的 在孫猴子的例子里 老孫變成的魚兒相當(dāng)于老孫的子類 這條魚兒與外界的互動要通過 委派 交給老孫的本尊 由老孫本尊采取行動 47 結(jié)構(gòu)型模式 Decorator 裝飾 48 結(jié)構(gòu)型模式 Decorator 裝飾 效果Decorator比靜態(tài)繼承更靈活 Decorator避免在層次結(jié)構(gòu)高層的類中有太多的特征 Decorator不等同于它所裝飾的對象 可能產(chǎn)生很多小對象 實現(xiàn)裝飾對象應(yīng)與被裝飾組件保持一致的接口 即組件的所有裝飾實現(xiàn)類擁有相同的父類 當(dāng)只有一個裝飾實現(xiàn)類時 可省略裝飾抽象類 組件與裝飾擁有相同父類 應(yīng)保持該父類的簡單性 裝飾可以用于改變組件的外觀 而不能改變組件的內(nèi)核 49 結(jié)構(gòu)型模式 Decorator 裝飾 50 結(jié)構(gòu)型模式 Facade 外觀 對象結(jié)構(gòu)型模式意圖為子系統(tǒng)中的一組接口提供一個一致的界面 Facade模式定義了一個高層接口 這個接口使得這一子系統(tǒng)更加容易使用 適用性 51 結(jié)構(gòu)型模式 Facade 外觀 對象結(jié)構(gòu)型模式意圖適用性為一個復(fù)雜子系統(tǒng)提供一個簡單接口 需要更多的可定制性的用戶可以越過Facade層 當(dāng)客戶程序與抽象類的實現(xiàn)部分之間存在著很大的依賴性時 引入Facade將這個子系統(tǒng)與客戶以及其他的子系統(tǒng)分離 可以提高子系統(tǒng)的獨(dú)立性和可移植性 在構(gòu)建一個層次結(jié)構(gòu)的子系統(tǒng)時 使用Facade模式定義子系統(tǒng)中每層的入口點(diǎn) 讓相互依賴的子系統(tǒng)之間僅通過Facade進(jìn)行通訊 可以簡化它們之間的依賴關(guān)系 52 結(jié)構(gòu)型模式 Facade 外觀 53 結(jié)構(gòu)型模式 兩個角色 門面 Facade 角色 客戶端可以調(diào)用這個角色的方法 此角色知曉相關(guān)的 一個或者多個 子系統(tǒng)的功能和責(zé)任 在正常情況下 本角色會將所有從客戶端發(fā)來的請求委派到相應(yīng)的子系統(tǒng)去 子系統(tǒng) subsystem 角色 可以同時有一個或者多個子系統(tǒng) 每一個子系統(tǒng)都不是一個單獨(dú)的類 而是一個類的集合 每一個子系統(tǒng)都可以被客戶端直接調(diào)用 或者被門面角色調(diào)用 子系統(tǒng)并不知道門面的存在 對于子系統(tǒng)而言 門面僅僅是另外一個客戶端而已 54 結(jié)構(gòu)型模式 Facade 外觀 55 結(jié)構(gòu)型模式 Facade 外觀 56 結(jié)構(gòu)型模式 Flyweight 享元 對象結(jié)構(gòu)型模式意圖運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象 適用性 57 結(jié)構(gòu)型模式 Flyweight 享元 對象結(jié)構(gòu)型模式意圖適用性應(yīng)用程序使用了大量的對象 造成很大的存儲開銷 對象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài) 如果刪除對象的外部狀態(tài) 那么可以用相對較少的共享對象取代很多組對象 應(yīng)用程序不依賴于對象標(biāo)識 由于Flyweight對象可以被共享 對于概念上明顯有別的對象 標(biāo)識測試將返回真值 58 結(jié)構(gòu)型模式 享元模式以共享的方式高效地支持大量的細(xì)粒度對象 享元對象能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)狀態(tài) InternalState 和外蘊(yùn)狀態(tài) ExternalState 內(nèi)蘊(yùn)狀態(tài)是存儲在享元對象內(nèi)部并且不會隨環(huán)境改變而改變 因此內(nèi)蘊(yùn)狀態(tài)并可以共享 外蘊(yùn)狀態(tài)是隨環(huán)境改變而改變的 不可以共享的狀態(tài) 享元對象的外蘊(yùn)狀態(tài)必須由客戶端保存 并在享元對象被創(chuàng)建之后 在需要使用的時候再傳入到享元對象內(nèi)部 外蘊(yùn)狀態(tài)與內(nèi)蘊(yùn)狀態(tài)是相互獨(dú)立的 59 結(jié)構(gòu)型模式 Flyweight 享元 60 結(jié)構(gòu)型模式 角色如下 抽象享元 Flyweight 角色 此角色是所有的具體享元類的超類 為這些類規(guī)定出需要實現(xiàn)的公共接口 那些需要外蘊(yùn)狀態(tài) ExternalState 的操作可以通過調(diào)用商業(yè)方法以參數(shù)形式傳入 具體享元 ConcreteFlyweight 角色 實現(xiàn)抽象享元角色所規(guī)定的接口 如果有內(nèi)蘊(yùn)狀態(tài)的話 必須負(fù)責(zé)為內(nèi)蘊(yùn)狀態(tài)提供存儲空間 享元對象的內(nèi)蘊(yùn)狀態(tài)必須與對象所處的周圍環(huán)境無關(guān) 從而使得享元對象可以在系統(tǒng)內(nèi)共享的 61 結(jié)構(gòu)型模式 復(fù)合享元 UnsharableFlyweight 角色 復(fù)合享元角色所代表的對象是不可以共享的 但是一個復(fù)合享元對象可以分解成為多個本身是單純享元對象的組合 復(fù)合享元角色又稱做不可共享的享元對象 62 結(jié)構(gòu)型模式 享元工廠 FlyweightFactory 角色 本角色負(fù)責(zé)創(chuàng)建和管理享元角色 本角色必須保證享元對象可以被系統(tǒng)適當(dāng)?shù)毓蚕?當(dāng)一個客戶端對象調(diào)用一個享元對象的時候 享元工廠角色會檢查系統(tǒng)中是否已經(jīng)有一個復(fù)合要求的享元對象 如果已經(jīng)有了 享元工廠角色就應(yīng)當(dāng)提供這個已有的享元對象 如果系統(tǒng)中沒有一個適當(dāng)?shù)南碓獙ο蟮脑?享元工廠角色就應(yīng)當(dāng)創(chuàng)建一個合適的享元對象 客戶端 Client 角色 本角色需要維護(hù)一個對所有享元對象的引用 本角色需要自行存儲所有享元對象的外蘊(yùn)狀態(tài) 63 結(jié)構(gòu)型模式 享元模式的應(yīng)用享元模式在編輯器系統(tǒng)中大量使用 一個文本編輯器往往會提供很多種字體 而通常的做法就是將每一個字母做成一個享元對象 享元對象的內(nèi)蘊(yùn)狀態(tài)就是這個字母 而字母在文本中的位置和字模風(fēng)格等其他信息則是外蘊(yùn)狀態(tài) 比如 字母a可能出現(xiàn)在文本的很多地方 雖然這些字母a的位置和字模風(fēng)格不同 但是所有這些地方使用的都是同一個字母對象 這樣一來 字母對象就可以在整個系統(tǒng)中共享 64 結(jié)構(gòu)型模式 Flyweight 享元 65 結(jié)構(gòu)型模式 享元模式的優(yōu)點(diǎn)和缺點(diǎn)享元模式的優(yōu)點(diǎn)在于它大幅度地降低內(nèi)存中對象的數(shù)量 但是 它做到這一點(diǎn)所付出的代價也是很高的 享元模式使得系統(tǒng)更加復(fù)雜 為了使對象可以共享 需要將一些狀態(tài)外部化 這使得程序的邏輯復(fù)雜化 享元模式將享元對象的狀態(tài)外部化 而讀取外部狀態(tài)使得運(yùn)行時間稍微變長 66 結(jié)構(gòu)型模式 Proxy 代理 對象結(jié)構(gòu)型模式意圖為其他對象提供一種代理以控制對這個對象的訪問 適用性在需要用比較通用和復(fù)雜的對象指針代替簡單的指針的時候 使用Proxy模式 67 結(jié)構(gòu)型模式 代理的種類 如果按照使用目的來劃分 可分為 遠(yuǎn)程 Remote 代理 為一個位于不同的地址空間的對象提供一個局域代表對象 這個不同的地址空間可以是在本機(jī)器中 也可是在另一臺機(jī)器中 遠(yuǎn)程代理又叫做大使 Ambassador 虛擬 Virtual 代理 根據(jù)需要創(chuàng)建一個資源消耗較大的對象 使得此對象只在需要時才會被真正創(chuàng)建 Copy on Write代理 虛擬代理的一種 把復(fù)制 克隆 拖延到只有在客戶端需要時 才真正采取行動 Cache代理 為某一個目標(biāo)操作的結(jié)果提供臨時的存儲空間 以便多個客戶端可以共享這些結(jié)果 68 結(jié)構(gòu)型模式 保護(hù) ProtectorAccess 代理 控制對一個對象的訪問 如果需要 可以給不同的用戶提供不同級別的使用權(quán)限 防火墻 Firewall 代理 保護(hù)目標(biāo) 不讓惡意用戶接近 同步化 Synchronization 代理 使幾個用戶能夠同時使用一個對象而沒有沖突 智能引用 SmartReference 代理 當(dāng)一個對象被引用時 提供一些額外的操作 比如將對此對象調(diào)用的次數(shù)記錄下來等 69 結(jié)構(gòu)型模式 Proxy 代理 70 結(jié)構(gòu)型模式 角色 抽象主題角色 Subject 聲明了真實主題和代理主題的共同接口 這樣一來在任何使用真實主題的地方都可以使用代理主題 真實主題角色 RealSubject 角色 定義了代理角色所代表的真實對象 71 結(jié)構(gòu)型模式 角色 代理主題 Proxy 角色 代理主題角色內(nèi)部含有對真是主題的引用 從而可以在任何時候操作真實主題對象 代理主題角色提供一個與真實主題角色相同的接口 以便可以在任何時候都可以替代真實主體 控制真實主題的應(yīng)用 負(fù)責(zé)在需要的時候創(chuàng)建真實主題對象 和刪除真實主題對象 代理角色通常在將客戶端調(diào)用傳遞給真實的主題之前或之后 都要執(zhí)行某個操作 而不是單純的將調(diào)用傳遞給真實主題對象 72 結(jié)構(gòu)型模式 Proxy 代理 73 結(jié)構(gòu)型模式 結(jié)構(gòu)型模式的討論Adapter和Bridge都涉及到從自身以外的接口向另一對象發(fā)送請求 Adapter是為了解決兩個接口不匹配 Bridge則是對抽象接口與其實現(xiàn)部分進(jìn)行橋接 Adapter通常在類設(shè)計好之后實施 Bridge則在類設(shè)計之前實施 Adapter使兩個已經(jīng)存在的接口協(xié)同工作 并不定義新的接口 而Facade則定義了一個新的接口 Composite和Decorator都是基于遞歸組合來組織可變數(shù)目的對象 但Composite的目的是使多個相關(guān)對象能夠被當(dāng)作一個對象來處理 Decorator的目的則是不需要生成子類即可給對象添加職責(zé) Decorator和Proxy都描述了為對象提供間接引用 但Proxy不能動態(tài)地添加或分離性質(zhì) 也不是為遞歸組合而設(shè)計的 是由實體完成關(guān)鍵功能 Proxy控制其訪問 而Decorator則是在組件基本功能之外完成附加的功能 74 行為模式 行為模式的目的行為模式涉及到算法和對象間職責(zé)的分配 行為模式描述對象或類之間的通信模式 刻畫了在運(yùn)行時難以跟蹤的復(fù)雜的控制流 75 ChainofResponsibility Observer Command Interpreter Iterator Mediator Memento State Strategy TemplateMethod Visitor 行為模式 ChainofResponsibility 響應(yīng)鏈 對象行為模式意圖使多個對象都有機(jī)會處理請求 從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系 將這些對象連成一條鏈 并沿著這條鏈傳遞該請求 直到有一個對象處理它為止 適用性 76 行為模式 ChainofResponsibility 響應(yīng)鏈 對象行為模式意圖適用性有多個對象可以處理一個請求 哪個對象處理該請求在運(yùn)行時刻自動確定 在不明確指定接收者的情況下 向多個對象中的一個提交一個請求 可處理一個請求的對象集合應(yīng)被動態(tài)指定 77 行為模式 擊鼓傳花擊鼓傳花是一種熱鬧而又緊張的飲酒游戲 在酒宴上賓客依次坐定位置 由一人擊鼓 擊鼓的地方與傳花的地方是分開的 以示公正 開始擊鼓時 花束就開始依次傳遞 鼓聲一落 如果花束在某人手中 則該人就得飲酒 擊鼓傳花便是責(zé)任鏈模式的應(yīng)用 責(zé)任鏈可能是一條直線 一個環(huán)鏈或者一個樹結(jié)構(gòu)的一部分 78 行為模式 ChainofResponsibility 響應(yīng)鏈 79 行為模式 角色如下 抽象處理者 Handler 角色 定義出一個處理請求的接口 如果需要 接口可以定義出一個方法 以設(shè)定和返回對下家的引用 這個角色通常由一個抽象類或接口實現(xiàn) 具體處理者 ConcreteHandler 角色 具體處理者接到請求后 可以選擇將請求處理掉 或者將請求傳給下家 由于具體處理者持有對下家的引用 因此 如果需要 具體處理者可以訪問下家 80 行為模式 ChainofReponsibility 響應(yīng)鏈 81 行為模式 ChainofReponsibility 響應(yīng)鏈 效果降低了對象間的耦合度 增強(qiáng)了給對象分配響應(yīng) 職責(zé) 的靈活性 不保證請求被響應(yīng) 實現(xiàn)后續(xù)鏈的實現(xiàn)請求的表示 硬編碼方式或請求碼方式 82 行為模式 Command 命令 對象行為模式意圖將一個請求封裝為一個對象 從而使你可用不同的請求對客戶進(jìn)行參數(shù)化 對請求排隊或記錄請求日志 以及支持可撤消的操作 適用性 83 行為模式 Command 命令 對象行為模式意圖適用性抽象出待執(zhí)行的動作以參數(shù)化某對象 Command模式是回調(diào)機(jī)制的一個面向?qū)ο蟮奶娲?在不同的時刻指定 排列和執(zhí)行請求 支持取消操作 支持修改日志 這樣當(dāng)系統(tǒng)崩潰時 這些修改可以被重做一遍 用構(gòu)建在原語操作上的高層操作構(gòu)造一個系統(tǒng) 84 行為模式 Command 命令 85 行為模式 角色 客戶 Client 角色 創(chuàng)建了一個具體命令 ConcreteCommand 對象并確定其接收者 命令 Command 角色 聲明了一個給所有具體命令類的抽象接口 這是一個抽象角色 具體命令 ConcreteCommand 角色 定義一個接受者和行為之間的弱耦合 實現(xiàn)Execute 方法 負(fù)責(zé)調(diào)用接收者的相應(yīng)操作 Execute 方法通常叫做執(zhí)方法 86 行為模式 角色 請求者 Invoker 角色 負(fù)責(zé)調(diào)用命令對象執(zhí)行請求 相關(guān)的方法叫做行動方法 接收者 Receiver 角色 負(fù)責(zé)具體實施和執(zhí)行一個請求 任何一個類都可以成為接收者 實施和執(zhí)行請求的方法叫做行動方法 87 行為模式 Command 行為 88 行為模式 Command 命令 效果將調(diào)用操作的對象與實現(xiàn)操作的對象解耦 Command對象也可以被操縱和擴(kuò)展 可以將多個Command裝配成一個復(fù)合Command 無需改變已有的類 可以容易地增加新Command 實現(xiàn)Command對象的智能程度 對Undo和Redo的支持 避免Undo操作過程中的錯誤積累 在C 中可以用模板來實現(xiàn)簡單的Command類 89 行為模式 Interpreter 解釋器 類行為模式意圖根據(jù)語言的文法 定義一個解釋器 用來解釋語言中的句子 適用性當(dāng)有一個語言需要解釋執(zhí)行 并且該語言中的句子可以表示為一個抽象語法樹時 當(dāng)滿足以下情況時 解釋器模式的效果最好 文法簡單 效率不是一個關(guān)鍵問題 90 行為模式 Interpreter 解釋器 91 行為模式 AbstractExpression抽象解釋器 聲明一個抽象的解釋操作 這個接口為所有具體表達(dá)式角色 抽象語法樹中的節(jié)點(diǎn) 都要實現(xiàn)的 具體的解釋任務(wù)由各個實現(xiàn)類完成 具體的解釋器分別由TerminalExpression和NonterminalExpression完成 TerminalExpression終結(jié)符表達(dá)式 實現(xiàn)與文法中的元素相關(guān)聯(lián)的解釋操作 通常一個解釋器模式中只有一個終結(jié)符表達(dá)式 但有多個實例 對應(yīng)不同的終結(jié)符 92 行為模式 NonterminalExpression非終結(jié)符表達(dá)式 文法中的每條規(guī)則對應(yīng)于一個非終結(jié)表達(dá)式 非終結(jié)符表達(dá)式根據(jù)邏輯的復(fù)雜程度而增加 原則上每個文法規(guī)則都對應(yīng)一個非終結(jié)符表達(dá)式 Context環(huán)境角色 包含解釋器之外的一些全局信息 客戶角色 構(gòu)建 或者被給定 表示該文法定義的語言中的一個特定的句子的抽象語法樹 調(diào)用解釋操作解釋器是一個比較少用的模式 以下為其通用源碼 可以作為參考 抽象表達(dá)式通常只有一個方法 如下所示 93 行為模式 Interpreter 解釋器 效果通過對文法規(guī)則類的繼承和擴(kuò)展可以方便地改變和擴(kuò)展文法 語法樹上各節(jié)點(diǎn)類的實現(xiàn)大體相似 易于實現(xiàn)文法 復(fù)雜的文法將難以維護(hù) 可以方便地增加新的解釋表達(dá)式的方式 實現(xiàn)抽象語法樹的創(chuàng)建 定義解釋操作 可以使用Flyweight模式共享終結(jié)符 94 行為模式 Iterator 迭代器 對象行為模式意圖提供一種方法順序訪問一個聚合對象中各個元素 而又不需暴露該對象的內(nèi)部表示 適用性訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示 支持對聚合對象的多個和多種遍歷 為遍歷不同的聚合結(jié)構(gòu)提供一個統(tǒng)一的接口 95 行為模式 迭代這個名詞對于熟悉Java的人來說絕對不陌生 我們常常使用JDK提供的迭代接口進(jìn)行javacollection的遍歷 Iteratorit list iterator while it hasNext using it next dosomebusinessslogic 而這就是關(guān)于迭代器模式應(yīng)用很好的例子 96 行為模式 Iterator 迭代器 97 行為模式 角色組成 迭代器角色 Iterator 迭代器角色負(fù)責(zé)定義訪問和遍歷元素的接口 具體迭代器角色 ConcreteIterator 具體迭代器角色要實現(xiàn)迭代器接口 并要記錄遍歷中的當(dāng)前位置 容器角色 Container 容器角色負(fù)責(zé)提供創(chuàng)建具體迭代器角色的接口 具體容器角色 ConcreteContainer 具體容器角色實現(xiàn)創(chuàng)建具體迭代器角色的接口 這個具體迭代器角色于該容器的結(jié)構(gòu)相關(guān) 98 行為模式 Iterator 迭代器 效果支持以不同方式遍歷一個聚合 簡化了聚合的接口 聚合不必再提供用于遍歷的接口 在同一個聚合上可以有多個遍歷 實現(xiàn)誰來控制迭代誰來提供遍歷算法迭代器的健壯程度附加的迭代器操作多態(tài)迭代器的管理 堆中分配的迭代器的撤銷 迭代器的特權(quán)訪問復(fù)合對象上的迭代器空迭代器 99 行為模式 Mediator 中介者 對象行為模式意圖用一個中介對象來封裝一系列的對象交互 中介者使各對象不需要顯式地相互引用 從而使其耦合松散 而且可以獨(dú)立地改變它們之間的交互 適用性 100 行為模式 Mediator 中介者 對象行為模式意圖適用性一組對象以定義良好但是復(fù)雜的方式進(jìn)行通信 產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解 一個對象引用其他很多對象并且直接與這些對象通信 導(dǎo)致難以復(fù)用該對象 想定制一個分布在多個類中的行為 而又不想生成太多的子類 101 行為模式 Mediator 中介者 102 行為模式 角色 抽象中介者 Mediator 角色 抽象中介者角色定義統(tǒng)一的接口用于各同事角色之間的通信 具體中介者 ConcreteMediator 角色 具體中介者角色通過協(xié)調(diào)各同事角色實現(xiàn)協(xié)作行為 為此它要知道并引用各個同事角色 同事 Colleague 角色 每一個同事角色都知道對應(yīng)的具體中介者角色 而且與其他的同事角色通信的時候 一定要通過中介者角色協(xié)作 103 行為模式 104 行為模式 Mediator 中介者 105 行為模式 Mediator 中介者 效果減少了子類的生成 要改變行為只須生成Mediator的子類 將各Colleague解耦 有利于各Colleague間的松耦合 用一對多交互代替多對多交互 簡化的交互協(xié)議 將對象間的協(xié)作關(guān)系抽象并封裝 使交互關(guān)系更清楚 控制集中化可能導(dǎo)致Mediator的復(fù)雜性過高 難以維護(hù) 實現(xiàn)僅有一個Mediator時 可忽略抽象Mediator類 Colleague與Mediator間通信的實現(xiàn) 106 行為模式 Memento 備忘錄 對象行為模式意圖在不破壞封裝性的前提下 捕獲一個對象的內(nèi)部狀態(tài) 并在該對象之外保存這個狀態(tài) 這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài) 適用性必須保存一個對象在某一個時刻的 部分 狀態(tài) 這樣以后需要時它才能恢復(fù)到先前的狀態(tài) 如果一個用接口來讓其它對象直接得到這些狀態(tài) 將會暴露對象的實現(xiàn)細(xì)節(jié)并破壞對象的封裝性 107 行為模式 Memento 備忘錄 108 行為模式 角色 備忘錄 Memento 角色 備忘錄角色存儲 備忘發(fā)起角色 的內(nèi)部狀態(tài) 備忘發(fā)起角色 根據(jù)需要決定備忘錄角色存儲 備忘發(fā)起角色 的哪些內(nèi)部狀態(tài) 為了防止 備忘發(fā)起角色 以外的其他對象訪問備忘錄 備忘錄實際上有兩個接口 備忘錄管理者角色 只能看到備忘錄提供的窄接口 對于備忘錄角色中存放的屬性是不可見的 備忘發(fā)起角色 則能夠看到一個寬接口 能夠得到自己放入備忘錄角色中屬性 109 行為模式 備忘錄發(fā)起 Originator 角色 備忘發(fā)起角色 創(chuàng)建一個備忘錄 用以記錄當(dāng)前時刻它的內(nèi)部狀態(tài) 在需要時使用備忘錄恢復(fù)內(nèi)部狀態(tài) 備忘錄管理者 Caretaker 角色 負(fù)責(zé)保存好備忘錄 不能對備忘錄的內(nèi)容進(jìn)行操作或檢查 110 行為模式 Memento 備忘錄 效果保持了封裝的邊界 將狀態(tài)交給Client去管理 簡化了Originator Memento的實現(xiàn)代價可能很高 需要對窄接口和寬接口的支持 維護(hù)Memento的潛在代價 實現(xiàn)窄接口和寬接口的實現(xiàn) 在Memento創(chuàng)建和撤銷順序可預(yù)測時 存儲增量式改變 111 行為模式 Observer 觀察者 對象行為模式意圖定義對象間的一種一對多的依賴關(guān)系 當(dāng)一個對象的狀態(tài)發(fā)生改變時 所有依賴于它的對象都得到通知并被自動更新 適用性 112 行為模式 Observer 觀察者 對象行為模式意圖適用性當(dāng)一個抽象模型有兩個方面 其中一個方面依賴于另一方面 將這二者封裝在獨(dú)立的對象中以使它們可以各自獨(dú)立地改變和復(fù)用 當(dāng)對一個對象的改變需要同時改變其它對象 而不知道具體有多少對象有待改變 當(dāng)一個對象必須通知其它對象 而它又不能假定其它對象是誰 換言之 不希望這些對象是緊密耦合的 113 行為模式 觀察者模式又叫做發(fā)布 訂閱 Publish Subscribe 模式 模型 視圖 Model View 模式 源 監(jiān)聽 Source Listener 模式或從屬者 Dependents 模式 觀察者模式定義了一種一對多的依賴關(guān)系 讓多個觀察者對象同時監(jiān)聽某一個主題對象 這個主題對象在狀態(tài)上發(fā)生變化時 會通知所有觀察者對象 使它們能夠自動更新自己 114 行為模式 一個軟件系統(tǒng)常常要求在某一個對象的狀態(tài)發(fā)生變化的時候 某些其它的對象做出相應(yīng)的改變 做到這一點(diǎn)的設(shè)計方案有很多 但是為了使系統(tǒng)能夠易于復(fù)用 應(yīng)該選擇低耦合度的設(shè)計方案 減少對象之間的耦合有利于系統(tǒng)的復(fù)用 但是同時設(shè)計師需要使這些低耦合度的對象之間能夠維持行動的協(xié)調(diào)一致 保證高度的協(xié)作 Collaboration 觀察者模式是滿足這一要求的各種設(shè)計方案中最重要的一種 115 行為模式 Observer 觀察者 116 行為模式 角色 抽象主題 Subject 角色 主題角色把所有對觀察考對象的引用保存在一個聚集里 每個主題都可以有任何數(shù)量的觀察者 抽象主題提供一個接口 可以增加和刪除觀察者對象 主題角色又叫做抽象被觀察者 Observable 角色 一般用一個抽象類或者一個接口實現(xiàn) 抽象觀察者 Observer 角色 為所有的具體觀察者定義一個接口 在得到主題的通知時更新自己 這個接口叫做更新接口 抽象觀察者角色一般用一個抽象類或者一個接口實現(xiàn) 在這個示意性的實現(xiàn)中 更新接口只包含一個方法 即Update 方法 這個方法叫做更新方法 117 行為模式 具體主題 ConcreteSubject 角色 將有關(guān)狀態(tài)存入具體現(xiàn)察者對象 在具體主題的內(nèi)部狀態(tài)改變時 給所有登記過的觀察者發(fā)出通知 具體主題角色又叫做具體被觀察者角色 ConcreteObservable 具體主題角色通常用一個具體子類實現(xiàn) 具體觀察者 ConcreteObserver 角色 存儲與主題的狀態(tài)自恰的狀態(tài) 具體現(xiàn)察者角色實現(xiàn)抽象觀察者角色所要求的更新接口 以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào) 如果需要 具體現(xiàn)察者角色可以保存一個指向具體主題對象的引用 具體觀察者角色通常用一個具體子類實現(xiàn) 118 行為模式 Observer 觀察者 效果目標(biāo)與觀察者之間的耦合是抽象和最小的 支持廣播通信 對通知的響應(yīng)取決于觀察者 可能引起意外的更新 實現(xiàn)創(chuàng)建目標(biāo)與觀察者之間的映射 觀察多個目標(biāo)時 應(yīng)修改Update使觀察者知道發(fā)出通知的目標(biāo) Notify的觸發(fā) 刪除一個目標(biāo)時 應(yīng)通知觀察者 避免懸掛引用 發(fā)出通知前確保目標(biāo)狀態(tài)的穩(wěn)定 避免特定于觀察者的更新協(xié)議 推 拉模型 可以顯式地指定觀察者感興趣的改變 封裝復(fù)雜的更新語義 119 行為模式 State 狀態(tài) 對象行為模式意圖允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為 對象看起來似乎修改了它的類 適用性 120 行為模式 State 狀態(tài) 對象行為模式意圖適用性一個對象的行為取決于它的狀態(tài) 并且它必須在運(yùn)行時刻根據(jù)狀態(tài)改變它的行為 一個操作中含有龐大的多分支的條件語句 且這些分支依賴于該對象的狀態(tài) 這個狀態(tài)通常用一個或多個枚舉常量表示 通常 有多個操作包含這一相同的條件結(jié)構(gòu) State模式將每一個條件分支放入一個獨(dú)立的類中 這使得可以根據(jù)對象自身的情況將對象的狀態(tài)作為一個對象 這一對象可以不依賴于其他對象而獨(dú)立變化 121 行為模式 State 狀態(tài) 122 行為模式 角色 使用環(huán)境 Context 角色 客戶程序是通過它來滿足自己的需求 它定義了客戶程序需要的接口 并且維護(hù)一個具體狀態(tài)角色的實例 這個實例來決定當(dāng)前的狀態(tài)狀態(tài) State 角色 定義一個接口以封裝與使用環(huán)境角色的一個特定狀態(tài)相關(guān)的行為 具體狀態(tài) ConcreteState 角色 實現(xiàn)狀態(tài)角色定義的接口 123 行為模式 State 狀態(tài) 124 行為模式 State 狀態(tài) 效果將與特定狀態(tài)相關(guān)的行為局部化 將不同狀態(tài)的行為分割開來 使得狀態(tài)轉(zhuǎn)換顯式化 State對象可以被共享 125 行為模式 Strategy 策略 對象行為模式意圖定義一系列的算法 把它們一個個封裝起來 并且使它們可相互替換 本模式使得算法可獨(dú)立于使用它的客戶而變化 適用性 126 行為模式 Strategy 策略 對象行為模式意圖適用性許多相關(guān)的類僅僅是行為有異 策略 提供了一種用多個行為中的一個行為來配置一個類的方法 需要使用一個算法的不同變體 算法使用客戶不應(yīng)該知道的數(shù)據(jù) 可使用策略模式以避免暴露復(fù)雜的 與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu) 一個類定義了多種行為 并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn) 將相關(guān)的條件分支移入它們各自的Strategy類中以代替這些條件語句 127 行為模式 策略模式的用意是針對一組算法 將每一個算法封裝到具有共同接口的獨(dú)立的類中 從而使得它們可以相互替換 策略模式使得算法可以在不影響到客戶端的情況下發(fā)生變化 假設(shè)現(xiàn)在要設(shè)計一個販賣各類書籍的電子商務(wù)網(wǎng)站的購物車 ShoppingCat 系統(tǒng) 一個最簡單的情況就是把所有貨品的單價乘上數(shù)量 但是實際情況肯定比這要復(fù)雜 比如 本網(wǎng)站可能對所有的教材類圖書實行每本一元的折扣 對連環(huán)畫類圖書提供每本7 的促銷折扣 而對非教材類的計算機(jī)圖書有3 的折扣 對其余的圖書沒有折扣 由于有這樣復(fù)雜的折扣

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論