華南理工大學(xué)UML課件-14設(shè)計(jì)模式_第1頁(yè)
華南理工大學(xué)UML課件-14設(shè)計(jì)模式_第2頁(yè)
華南理工大學(xué)UML課件-14設(shè)計(jì)模式_第3頁(yè)
華南理工大學(xué)UML課件-14設(shè)計(jì)模式_第4頁(yè)
華南理工大學(xué)UML課件-14設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩88頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、軟件需求分析與建模-設(shè)計(jì)模式主講:( )2022年8月27日1 基本概念 基本要素 模式分類工廠模式單例模式策略模式MVC模式引言設(shè)計(jì)模式的起源模式的研究起源于建筑工程設(shè)計(jì)大師Christopher Alexander的關(guān)于城市規(guī)劃和建筑設(shè)計(jì)的著作(建筑的永恒之道).在面向?qū)ο蟮木幊讨惺褂媚J交椒ㄑ芯康拈_(kāi)創(chuàng)性著作設(shè)計(jì)模式-可復(fù)用面向?qū)ο筌浖幕A(chǔ)這本書(shū)的四位作者也通常被稱為“四人幫”。建議閱讀以下三本書(shū)1.設(shè)計(jì)模式可復(fù)用面向?qū)ο筌浖幕A(chǔ)2.Java與模式,作者:閻宏。3.Inside VCL,作者:李維。在面向?qū)ο蟮木幊讨?,軟件編程人員更加注重現(xiàn)有代碼的重用性和可維護(hù)性。設(shè)計(jì)模式使人們可以

2、更加簡(jiǎn)單方便地重用成功的設(shè)計(jì)和體系結(jié)構(gòu)。將已證實(shí)的技術(shù)表述成設(shè)計(jì)模式也會(huì)使新系統(tǒng)開(kāi)發(fā)者更加容易理解其設(shè)計(jì)思路。A pattern is an idea that has been useful in one practical context and will probably be useful in others.-Martin Fowler設(shè)計(jì)模式-基本概念一般而言,一個(gè)模式有四個(gè)基本要素模式名稱(pattern name)問(wèn)題(problem)解決方案(solution)效果(consequences)設(shè)計(jì)模式-基本要素模式名稱(pattern name) 一個(gè)助記名,它用一兩個(gè)詞來(lái)描

3、述模式的問(wèn)題、解決方案和效果。設(shè)計(jì)模式允許我們?cè)谳^高的抽象層次上進(jìn)行設(shè)計(jì)。模式名可以幫助我們思考,便于我們與其他人交流設(shè)計(jì)思想及設(shè)計(jì)結(jié)果。找到恰當(dāng)?shù)哪J矫彩俏覀冊(cè)O(shè)計(jì)模式編目工作的難點(diǎn)之一。設(shè)計(jì)模式-基本要素問(wèn)題(problem) 描述了應(yīng)該在何時(shí)使用模式。它解釋了設(shè)計(jì)問(wèn)題和問(wèn)題存在的前因后果,它可能描述了特定的設(shè)計(jì)問(wèn)題,如怎樣用對(duì)象表示算法等。也可能描述了導(dǎo)致不靈活設(shè)計(jì)的類或?qū)ο蠼Y(jié)構(gòu)。有時(shí)候,問(wèn)題部分會(huì)包括使用模式必須滿足的一系列先決條件。設(shè)計(jì)模式-基本要素解決方案(solution) 描述了設(shè)計(jì)的組成成分,它們之間的相互關(guān)系及各自的職責(zé)和協(xié)作方式。因?yàn)槟J骄拖褚粋€(gè)模板,可應(yīng)用于多種不同場(chǎng)合

4、,所以解決方案并不描述一個(gè)特定而具體的設(shè)計(jì)或?qū)崿F(xiàn),而是提供設(shè)計(jì)問(wèn)題的抽象描述和怎樣用一個(gè)具有一般意義的元素組合(類或?qū)ο蠼M合)來(lái)解決這個(gè)問(wèn)題。設(shè)計(jì)模式-基本要素效果(consequences) 描述了模式應(yīng)用的效果及使用模式應(yīng)權(quán)衡的問(wèn)題。盡管我們描述設(shè)計(jì)決策時(shí),并不總提到模式效果,但它們對(duì)于評(píng)價(jià)設(shè)計(jì)選擇和理解使用模式的代價(jià)及好處具有重要意義。軟件效果大多關(guān)注對(duì)時(shí)間和空間的衡量,它們也表述了語(yǔ)言和實(shí)現(xiàn)問(wèn)題。因?yàn)閺?fù)用是面向?qū)ο笤O(shè)計(jì)的要素之一,所以模式效果包括它對(duì)系統(tǒng)的靈活性、擴(kuò)充性或可移植性的影響,顯式地列出這些效果對(duì)理解和評(píng)價(jià)這些模式很有幫助。設(shè)計(jì)模式-基本要素創(chuàng)建型模式抽象的實(shí)例化過(guò)程結(jié)構(gòu)型模

5、式如何組合類和對(duì)象以獲得更大的結(jié)構(gòu)行為型模式涉及到算法和對(duì)象間職責(zé)的分配設(shè)計(jì)模式-模式分類設(shè)計(jì)模式的分類1、創(chuàng)建型設(shè)計(jì)模式 創(chuàng)建型模式隱藏了對(duì)象創(chuàng)建的具體細(xì)節(jié),使程序代碼不依賴具體的對(duì)象。 創(chuàng)建型類的模式有工廠方法(Factory Method)模式; 創(chuàng)建型對(duì)象模式包括抽象工廠(Abstract Factory)、建造(Builder)、原型(Prototype)、單例 (Singleton)四種模式。設(shè)計(jì)模式的分類及其相互間關(guān)系2、結(jié)構(gòu)型設(shè)計(jì)模式 結(jié)構(gòu)型模式描述類和對(duì)象之間通過(guò)組織形成新的結(jié)構(gòu),以實(shí)現(xiàn)新的功能。 結(jié)構(gòu)型的類模式采用繼承機(jī)制來(lái)組合類,如適配器(Adapter)類模式; 結(jié)構(gòu)型

6、的對(duì)象模式則描述了對(duì)象的組裝方式,如適配器(Adapter)對(duì)象模式、橋接(Bridge)模式、組合(Composite)模式、裝飾(Decorator)模式、外觀(Facade)模式、享元(Flyweight)模式、代理(Proxy)模式等。3、行為型設(shè)計(jì)模式 行為型設(shè)計(jì)模式描述算法以及對(duì)象之間的任務(wù)(職責(zé))分配及它們之間的通訊模式。 行為型的類模式用繼承方法完成,有模板方法模式和解釋器模式; 行為型的對(duì)象模式使用對(duì)象復(fù)合方法而不是繼承,它描述一組對(duì)象怎樣協(xié)作完成單個(gè)對(duì)象所無(wú)法完成的任務(wù), 如職責(zé)鏈(Chain ofReponsibility)模式、命令(Command)模式、迭代器(Ite

7、rator)模式、中介者(Mediator)模式、備忘錄(Memento)模式、觀察者(Observer)模式、狀態(tài)(State)模式、策略(Strategy)模式、訪問(wèn)者(Visitor)模式等。模式的另一種分類Architectural Patterns 表達(dá)了軟件系統(tǒng)的基本結(jié)構(gòu)組織形式或者結(jié)構(gòu)方案它包含一組預(yù)定義的子系統(tǒng),規(guī)定了這些子系統(tǒng)的責(zé)任,同時(shí)還提供了用于組織和管理這些子系統(tǒng)的規(guī)則和向?qū)esign Patterns 為軟件系統(tǒng)的子系統(tǒng)、組件或者組件之間的關(guān)系提供一個(gè)精煉之后的解決方案它描述了在特定環(huán)境下,用于解決通用軟件設(shè)計(jì)問(wèn)題的組件以及這些組件相互通信時(shí)的可重現(xiàn)結(jié)構(gòu)Idioms

8、 是一個(gè)與編程語(yǔ)言相關(guān)的低級(jí)模式它描述了如何實(shí)現(xiàn)組件的某些功能,或者利用編程語(yǔ)言的特性來(lái)實(shí)現(xiàn)組件內(nèi)部要素之間的通信功能設(shè)計(jì)模式的指導(dǎo)原則重用(reuse):是目標(biāo)兩種重要的重用手段Inheritance & composition/aggregation接口與實(shí)現(xiàn)分離接口保持不變,分離帶來(lái)靈活性多態(tài)性(polymorphism)Decouple降低復(fù)雜性工廠模式的幾種類型工廠模式專門負(fù)責(zé)將大量有共同接口的類實(shí)例化。工廠模式可以動(dòng)態(tài)地決定將哪一個(gè)類實(shí)例化,不必事先知道每次要實(shí)例化哪一個(gè)類。工廠模式具有以下幾種類型:1.簡(jiǎn)單工廠:又稱靜態(tài)工廠方法模式2.工廠方法:又稱多態(tài)性工廠模式3.抽象工廠模式

9、:又稱工具箱模式(Toolkit)簡(jiǎn)單工廠模式簡(jiǎn)單工廠模式是類的創(chuàng)建模式簡(jiǎn)單工廠模式是有一個(gè)工廠類根據(jù)傳入的參量決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。情況1:客戶端需要?jiǎng)?chuàng)建各種不同的對(duì)象以類Sample為例, 假設(shè)要?jiǎng)?chuàng)建Sample的實(shí)例對(duì)象: Sample sample=new Sample(); 有時(shí)候可能要?jiǎng)?chuàng)建不同的Sample對(duì)象,那么可以用:If choice = 1 then sample = new Sample1 Else if chose = 2 then sample = new Sample2Else sample = new Sample3情況2:創(chuàng)建時(shí)包含大量的初始化工作如果

10、創(chuàng)建sample實(shí)例時(shí)包含了大量的初始化工作,例如賦值、查詢數(shù)據(jù)庫(kù)、安全審核、日志記錄等,那么對(duì)象的構(gòu)造函數(shù)中就包含了大量的額外工作。上述兩種情況都是將對(duì)象的創(chuàng)建與使用混合在一起,容易使得代碼變得非常復(fù)雜。如何解決這個(gè)問(wèn)題呢?要解決這個(gè)問(wèn)題,應(yīng)該盡量將創(chuàng)建實(shí)例的工作與使用實(shí)例的工作分開(kāi),也就是說(shuō),讓客戶端所做的各種判斷或者創(chuàng)建實(shí)例所需要的大量初始化工作與對(duì)象本身的構(gòu)造分離開(kāi)。 工廠類(Creator)角色:該角色是工廠方法模式的核心,含有與應(yīng)用緊密相關(guān)的商業(yè)邏輯。工廠類在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)品對(duì)象,它往往由一個(gè)具體類實(shí)現(xiàn)。 抽象產(chǎn)品(Product)角色:擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)

11、建的對(duì)象的父類,或它們共同擁有的接口。抽象產(chǎn)品角色可以用接口或者抽象類實(shí)現(xiàn)。 具體產(chǎn)品(Concrete Product)角色:工廠方法模式所創(chuàng)建的任何對(duì)象都是這個(gè)角色的實(shí)例,具體產(chǎn)品角色由一個(gè)具體類實(shí)現(xiàn)。角色與結(jié)構(gòu)Creator 類的源代碼public class Creator/* * 靜態(tài)工廠方法 */ public static Product factory() return new ConcreteProduct(); 實(shí)現(xiàn)例子/java中的簡(jiǎn)單工廠模式如下例 /* 手機(jī)接口 */ public interface Mobile public void call(); /* 諾基亞

12、手機(jī) */ public class Nokia implements Mobile public void call() System.out.println(Nokia produced .); /* 摩托羅拉手機(jī) */ public class Motorola implements Mobile public void call() System.out.println(Motorola produced .); /* 簡(jiǎn)單工廠模式中的核心部分:工廠類 */ public class SimpleFactory public static Mobile createMobile(Str

13、ing mobileName) if(mobileName.equals(NOKIA) new Nokia(); else if(mobileName.equals(MOTOROLA) new Motorola(); else throw new Exception(還不支持該種類型的手機(jī)生產(chǎn)!); /*客戶端測(cè)試 */ public class Client public static void main(String args) Mobile mobile = SimpleFactory.createMobile(NOKIA) ; mobile.cell() ; /創(chuàng)建Nokia ; mo

14、bile = SimpleFactory.createMobile(MOTOROLA) ; /接口回調(diào) mobile.cell() ; /創(chuàng)建Motorola ; 對(duì)前面的Sample來(lái)說(shuō),可以建立一個(gè)專門生產(chǎn)Sample實(shí)例的工廠: public class Factory public static Sample creator(int which) if (which=1) return new SampleA(); else if (which=2) return new SampleB(); 如果要實(shí)例化Sample時(shí),就可以就使用 Sample sampleA=Factory.cr

15、eator(1); 工廠類是整個(gè)模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象.通過(guò)使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。 簡(jiǎn)單工廠模式通過(guò)這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割。模式優(yōu)點(diǎn) 由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。 當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠類

16、根據(jù)不同條件創(chuàng)建不同實(shí)例的需求這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓延,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利; 模式的缺點(diǎn)功能的擴(kuò)展體現(xiàn)在引進(jìn)新的產(chǎn)品上。“開(kāi)閉”原則要求系統(tǒng)允許當(dāng)新的產(chǎn)品加入系統(tǒng)中,而無(wú)需對(duì)現(xiàn)有代碼進(jìn)行修改。這一點(diǎn)對(duì)于產(chǎn)品的消費(fèi)角色是成立的,而對(duì)于工廠角色是不成立的。觀察對(duì)于產(chǎn)品消費(fèi)角色來(lái)說(shuō),任何時(shí)候需要某種產(chǎn)品,只需向工廠角色請(qǐng)求即可。而工廠角色在接到請(qǐng)求后,會(huì)自行判斷創(chuàng)建和提供哪一個(gè)產(chǎn)品。所以,產(chǎn)品消費(fèi)角色無(wú)需知道它得到的是哪一個(gè)產(chǎn)品;換言之,產(chǎn)品消費(fèi)角色無(wú)需修改就可以接納新的產(chǎn)品。對(duì)于工廠角色來(lái)說(shuō),增加新的產(chǎn)品是一個(gè)痛苦的過(guò)程。工廠角色必須知道每一

17、種產(chǎn)品,如何創(chuàng)建它們,以及何時(shí)向客戶端提供它們。換言之,接納新的產(chǎn)品意味著修改這個(gè)工廠角色的源代碼。簡(jiǎn)單工廠角色只在有限的程度上支持“開(kāi)閉”原則。觀察在JAVA中的應(yīng)用1.java.text.DateFormat類中的getDateIntance方法.2.SAX2庫(kù)中的XMLReaderFactory等.3.大部分的單例模式工廠方法模式是類的創(chuàng)建模式,又叫做虛擬構(gòu)造子(Virtual Constructor)模式或者多態(tài)性工廠(Polymorphic Factory)模式。工廠方法模式的用意是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中。工廠方法模式在簡(jiǎn)單工廠模式中,一個(gè)工廠類處

18、于對(duì)產(chǎn)品類實(shí)例化的中心位置上,它知道每一個(gè)產(chǎn)品,它決定哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化。這個(gè)模式的優(yōu)點(diǎn)是允許客戶端相對(duì)獨(dú)立于產(chǎn)品創(chuàng)建的過(guò)程,并且在系統(tǒng)引入新產(chǎn)品的時(shí)候無(wú)需修改客戶端,也就是說(shuō),它在某種程度上支持“開(kāi)-閉”原則。這個(gè)模式的缺點(diǎn)是對(duì)“開(kāi)-閉”原則的支持不夠,因?yàn)槿绻行碌漠a(chǎn)品加入到系統(tǒng)中去,就需要修改工廠類,將必要的邏輯加入到工廠類中。工廠方法模式的引進(jìn)簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。工廠方法模式工廠方法模式的簡(jiǎn)略類圖在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有的產(chǎn)品的創(chuàng)建,而是將具

19、體創(chuàng)建的工作交給子類去做。這個(gè)核心類則搖身一變,成為了一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠子類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。這種進(jìn)一步抽象化的結(jié)果,使這種工廠方法模式可以用來(lái)允許系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品工廠方法模式工廠方法模式的結(jié)構(gòu)抽象工廠(Creator)角色:擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用程序無(wú)關(guān)的。任何在模式中創(chuàng)建對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。在上面的系統(tǒng)中這個(gè)角色由接口Creator 扮演;在實(shí)際的系統(tǒng)中,這個(gè)角色也常常使用抽象類實(shí)現(xiàn)。結(jié)構(gòu)與角色具體工廠(Concrete Creator)角色:擔(dān)任這個(gè)角色的是實(shí)現(xiàn)了抽象工

20、廠接口的具體類。具體工廠角色含有與應(yīng)用密切相關(guān)的邏輯,并且受到應(yīng)用程序的調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。在本系統(tǒng)中給出了兩個(gè)這樣的角色,也就是具體Java 類ConcreteCreator1 和ConcreteCreator2。結(jié)構(gòu)與角色抽象產(chǎn)品(Product)角色:工廠方法模式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口。在本系統(tǒng)中,這個(gè)角色由接口Product 扮演;在實(shí)際的系統(tǒng)中,這個(gè)角色也常常使用抽象類實(shí)現(xiàn)。結(jié)構(gòu)與角色具體產(chǎn)品(Concrete Product)角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所聲明的接口。工廠方法模式所創(chuàng)建的每一個(gè)對(duì)象都是某個(gè)具體產(chǎn)品角色的實(shí)例。在本系統(tǒng)中,這

21、個(gè)角色由具體類CocnreteProduct1 和oncreteProduct2 扮演,它們都實(shí)現(xiàn)了接口Product。結(jié)構(gòu)與角色Client 對(duì)象的活動(dòng)可以分成兩部分。(1)客戶端創(chuàng)建ConcreteCreator1 對(duì)象。這時(shí)客戶端所持有變量的靜態(tài)類型是Creator,而實(shí)際類型是ConcreteCreator1。然后,客戶端調(diào)用ConcreteCreator1 對(duì)象的工廠方法factory(),接著后者調(diào)用ConcreteProduct1 的構(gòu)造子創(chuàng)建出產(chǎn)品對(duì)象。如下面的時(shí)序圖所示。工廠方法模式的活動(dòng)序列圖工廠方法模式的活動(dòng)序列圖工廠方法模式和簡(jiǎn)單工廠模式在結(jié)構(gòu)上的不同是很明顯的。工廠方

22、法模式的核心是一個(gè)抽象工廠類,而簡(jiǎn)單工廠模式把核心放在一個(gè)具體類上。工廠方法模式可以允許很多具體工廠類從抽象工廠類中將創(chuàng)建行為繼承下來(lái),從而可以成為多個(gè)簡(jiǎn)單工廠模式的綜合,進(jìn)而推廣了簡(jiǎn)單工廠模式。比較工廠方法模式退化后可以變得很像簡(jiǎn)單工廠模式。設(shè)想如果非常確定一個(gè)系統(tǒng)只需要一個(gè)具體工廠類,那么就不妨把抽象工廠類合并到具體的工廠類中去。由于反正只有一個(gè)具體工廠類,所以不妨將工廠方法改成為靜態(tài)方法,這時(shí)候就得到了簡(jiǎn)單工廠模式。比較與簡(jiǎn)單工廠模式中的情形一樣的是,ConcreteCreator 的factory() 方法返還的數(shù)據(jù)類型是一個(gè)抽象類型Product,而不是哪一個(gè)具體產(chǎn)品類型,而客戶端也

23、不必知道所得到的產(chǎn)品的真實(shí)類型。這種多態(tài)性設(shè)計(jì)將工廠類選擇創(chuàng)建哪一個(gè)產(chǎn)品對(duì)象、如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)完全封裝在具體工廠類內(nèi)部。工廠方法模式之所以有一個(gè)別名叫多態(tài)性工廠模式,顯然是因?yàn)榫唧w工廠類都有共同的接口,或者都有共同的抽象父類。觀察如果系統(tǒng)需要加入一個(gè)新的產(chǎn)品,那么所需要的就是向系統(tǒng)中加入一個(gè)這個(gè)產(chǎn)品類以及它所對(duì)應(yīng)的工廠類。沒(méi)有必要修改客戶端,也沒(méi)有必要修改抽象工廠角色或者其他已有的具體工廠角色。對(duì)于增加新的產(chǎn)品類而言,這個(gè)系統(tǒng)完全支持“開(kāi)-閉”原則。觀察例在JAVA語(yǔ)言的API中的應(yīng)用1.java.util.Collection接口中的iterator()方法,返回的是一個(gè)Iterato

24、r類型的對(duì)象.2.List接口中的iterator()方法和listIterator()方法.3.Com架構(gòu)中的IClassFactory和CFactory類.4.EJB中的Home接口.5.JMS中的TopicConnectionFactory等.抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠(Abstract Factory)模式抽象工廠模式簡(jiǎn)略類圖左邊的等級(jí)結(jié)構(gòu)代表工廠等級(jí)結(jié)構(gòu),右邊的兩個(gè)等級(jí)結(jié)構(gòu)分別代表兩個(gè)不同的產(chǎn)品的等級(jí)結(jié)構(gòu)。抽象工廠模式可以向客戶端提供一個(gè)接口,使得客戶端在不必指定產(chǎn)品的具體類型的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。這就是抽象工廠模式的用

25、意。說(shuō)明抽象工廠模式抽象工廠模式與工廠方法模式的最大區(qū)別就在于,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)抽象工廠模式產(chǎn)品族,是指位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如在下圖中,箭頭所指就是三個(gè)功能相關(guān)聯(lián)的產(chǎn)品,它們位于三個(gè)不同的等級(jí)結(jié)構(gòu)中的相同位置上,組成一個(gè)產(chǎn)品族。產(chǎn)品族產(chǎn)品族如果采用工廠方法模式,就勢(shì)必要使用三個(gè)獨(dú)立的工廠等級(jí)結(jié)構(gòu)來(lái)對(duì)付這三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。由于這三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)的相似性,會(huì)導(dǎo)致三個(gè)平行的工廠等級(jí)結(jié)構(gòu)。隨著產(chǎn)品等級(jí)結(jié)構(gòu)的數(shù)目增加,工廠方法模式所給出的工廠等級(jí)結(jié)構(gòu)的數(shù)目也會(huì)隨之增加。抽象工廠模式抽象工廠模式設(shè)計(jì)抽象工廠(A

26、bstractFactory)角色:擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用系統(tǒng)的商業(yè)邏輯無(wú)關(guān)的。通常使用Java 接口或者抽象Java 類實(shí)現(xiàn),而所有的具體工廠類必須實(shí)現(xiàn)這個(gè)Java 接口或繼承這個(gè)抽象Java 類。結(jié)構(gòu)與角色具體工廠類(Concrete Factory)角色:這個(gè)角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇合適的產(chǎn)品對(duì)象的邏輯,而這個(gè)邏輯是與應(yīng)用系統(tǒng)的商業(yè)邏輯緊密相關(guān)的。通常使用具體Java 類實(shí)現(xiàn)這個(gè)角色。結(jié)構(gòu)與角色抽象產(chǎn)品(Abstract Product)角色:擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)建的對(duì)象的父類,或它們共同擁有的接口。通常使用Java

27、接口或者抽象Java 類實(shí)現(xiàn)這一角色。結(jié)構(gòu)與角色具體產(chǎn)品(Concrete Product)角色:抽象工廠模式所創(chuàng)建的任何產(chǎn)品對(duì)象都是某一個(gè)具體產(chǎn)品類的實(shí)例。這是客戶端最終需要的東西,其內(nèi)部一定充滿了應(yīng)用系統(tǒng)的商業(yè)邏輯。通常使用具體Java 類實(shí)現(xiàn)這個(gè)角色。結(jié)構(gòu)與角色抽象工廠模式的起源 將一組算法中的每個(gè)算法封裝到具有共同接口的獨(dú)立類中,使得它們可以相互替換。1使用策略模式的時(shí)機(jī) 多個(gè)類之間的區(qū)別僅在于它們的行為,使用策略模 式可以動(dòng)態(tài)地選擇一種行為。 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。 一個(gè)系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道。 避免使用難以維護(hù)的多重條件選擇語(yǔ)句,體現(xiàn)面向 對(duì)象設(shè)計(jì)

28、的概念。策略模式(Strategy) 策略模式的結(jié)構(gòu)策略模式涉及到三個(gè)角色: 語(yǔ)境(Context)角色:持有策略類Strategy的引用。 抽象策略(Strategy)角色:這是一個(gè)接口或抽象類。 具體策略(ConcreteStrategy)角色:以Strategy接口實(shí)現(xiàn)某個(gè)具體算法。實(shí)例分析例子:在一個(gè)販賣各種書(shū)籍的電子商務(wù)網(wǎng)站中,針對(duì)不同的書(shū)有不同的折扣.有些書(shū)不提供折扣;.有些書(shū)有一個(gè)固定折扣額;.有些書(shū)提供百分比折扣;實(shí)例分析策略模式的優(yōu)點(diǎn)有: 策略模式提供了管理相關(guān)的算法族的辦法。避免重復(fù) 的代碼。 策略模式提供了可以替換繼承關(guān)系的辦法。使其不可 能動(dòng)態(tài)改變算法或行為。 使用策略

29、模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。策略模式的缺點(diǎn)有: 客戶端必須知道所有的策略類,并自行決定使用哪一 個(gè)策略類。 策略模式造成很多的策略類。策略模式的優(yōu)點(diǎn)和缺點(diǎn)典型的應(yīng)用1.AWT中的LayoutManger中的各種GUI構(gòu)件的排列方式:BorderLayer,FlowLayout, GridLayout,GridBayLayout等2.例如酒店客房的費(fèi)用折扣計(jì)算3.常見(jiàn)的排序,例如二元排序,冒泡排序,堆棧排序,快速排序等.MVC概述WEB應(yīng)用的兩種開(kāi)發(fā)模式MVC操作順序MVC優(yōu)點(diǎn)MVC的適用性設(shè)計(jì)模式-MVC模式視圖控制器控制器模型int value=1MVC概述設(shè)計(jì)模式-實(shí)例:MVC模式M

30、VC模式最初使用SmallTalk開(kāi)發(fā),后來(lái)在Swing組件庫(kù)中廣泛應(yīng)用。該模式采用一個(gè)圖形化對(duì)象并將其任務(wù)分解成三部分:控制器:觸發(fā)一個(gè)對(duì)組件的改變。模型:提供修改、訪問(wèn)數(shù)據(jù)的方法。視圖:提供當(dāng)前數(shù)據(jù)的直觀顯示。MVC概述設(shè)計(jì)模式-實(shí)例:MVC模式JSP + JavaBean設(shè)計(jì)模式-實(shí)例:MVC模式Model1的主要特點(diǎn)表現(xiàn)層用HTML或JSP。JSP文件還負(fù)責(zé)所有的業(yè)務(wù)和處理邏輯JSP直接用代碼訪問(wèn)數(shù)據(jù)或JSP通過(guò)JavaBean存取數(shù)據(jù)。以頁(yè)面為中心,應(yīng)用程序的業(yè)務(wù)邏輯和程序流程都在頁(yè)面中出現(xiàn)。JSP要跳轉(zhuǎn)到別的頁(yè)面,通過(guò)超級(jí)鏈接或Form表單的action實(shí)現(xiàn)。設(shè)計(jì)模式-實(shí)例:MVC

31、模式JSP不僅負(fù)責(zé)表示邏輯,還負(fù)責(zé)控制邏輯大型項(xiàng)目中如果采取此方式,每個(gè)開(kāi)發(fā)小組必須了解其它小組開(kāi)發(fā)的所有頁(yè)面的詳細(xì)信息,否則對(duì)頁(yè)面的修改將會(huì)破壞應(yīng)用程序的流程。當(dāng)輸出設(shè)備不同時(shí)(比如股票信息輸出到顯示器、手機(jī)、PDA上),需要采用不同的輸出格式(即不同的視圖),那么用此方式JSP不僅要判定設(shè)備的類型,而且要為不同類型的設(shè)備提供正確的顯示格式。Model1的缺點(diǎn)設(shè)計(jì)模式-實(shí)例:MVC模式JSP + JavaBean +Servlet設(shè)計(jì)模式-實(shí)例:MVC模式MVC模型在一個(gè)典型的J2EE Web應(yīng)用中,MVC設(shè)計(jì)模式包括三個(gè)部分:模型(Model): 用于封裝數(shù)據(jù),一般是關(guān)系數(shù)據(jù)庫(kù)或EJB。視

32、圖(View): 數(shù)據(jù)的表現(xiàn)組件,通常就是JSP頁(yè)面,也可以是GUI,可以有多個(gè)??刂破鳎–ontroller): 接受用戶動(dòng)作,負(fù)責(zé)統(tǒng)一管理。一般是Servlet。在一個(gè)典型的企業(yè)級(jí)應(yīng)用中,經(jīng)常需要用多種類型的接口來(lái)支持多種類型的用戶。比如,一個(gè)網(wǎng)上商店可能需要:為網(wǎng)上顧客提供HTML前端,為無(wú)線用戶提供WML前端,為系統(tǒng)管理員提供JFC/Swing GUI,為供應(yīng)商提供基于XML的Web service。MVC模型HTMLViewWMLViewJFC/SwingViewXML-basedView企業(yè)信息系統(tǒng)傳統(tǒng)Web用戶無(wú)線用戶系統(tǒng)管理員B2B用戶Model含有應(yīng)用程序的功能核心,表示應(yīng)用程序的狀態(tài),它不管View和

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論