JAVA設(shè)計(jì)模式_第1頁(yè)
JAVA設(shè)計(jì)模式_第2頁(yè)
JAVA設(shè)計(jì)模式_第3頁(yè)
JAVA設(shè)計(jì)模式_第4頁(yè)
JAVA設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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、Topic:設(shè)計(jì)模式主要內(nèi)容 1 什么是設(shè)計(jì)模式 2 工廠模式 3 抽象工廠模式 4 單例模式 5 裝飾模式 6 MVC模式本章目標(biāo) 掌握設(shè)計(jì)模式的基本知識(shí) 能夠?qū)懗龉S模式,單例模式,抽象工廠模式和裝飾模式框架代碼 了解什么是MVC1 什么是設(shè)計(jì)模式? 設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 簡(jiǎn)而言之,在我們處理大量問(wèn)題時(shí),在很多不同的問(wèn)題中重復(fù)出現(xiàn)的一種性質(zhì),它使得我們可以使用一種方法來(lái)描述問(wèn)題實(shí)質(zhì)并用本質(zhì)上相同,但細(xì)節(jié)永不會(huì)重復(fù)的方法去解決,這種性質(zhì)

2、就叫模式。模式化過(guò)程是把問(wèn)題抽象化,在忽略掉不重要的細(xì)節(jié)后,發(fā)現(xiàn)問(wèn)題的一般性質(zhì)值,并找到普通使用的方法去解決的過(guò)程。 整個(gè)設(shè)計(jì)模式貫穿一個(gè)原理:面對(duì)接口編程,而不是面對(duì)實(shí)現(xiàn)。目標(biāo)原則是:降低耦合,增強(qiáng)靈活性。1 什么是設(shè)計(jì)模式? 關(guān)于GoF :(Gang of Four)n Design Patterns: Elements of Reusable Object-Oriented Software(即設(shè)計(jì)模式),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。這幾位作者常被稱為“

3、四人組(Gang of Four)”,而這本書(shū)也就被稱為“四人組(或 GoF)”書(shū)。n 在設(shè)計(jì)模式這本書(shū)的最大部分是一個(gè)目錄,該目錄列舉并描述了23 種設(shè)計(jì)模式。另外,近來(lái)這一清單又增加了一些類別,最重要的是使涵蓋范圍擴(kuò)展到更具體的問(wèn)題類型。例如,Mark Grand 在 Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML(模式 Java 版)中增加了解決涉及諸如并發(fā)等問(wèn)題的模式,而由 Deepak Alur、John Crupi 和 Dan Malks 合著的 Core J2EE Patte

4、rns: Best Practices and Design Strategies 一書(shū)中主要關(guān)注使用 Java 2 企業(yè)技術(shù)的多層應(yīng)用程序上的模式。1 什么是設(shè)計(jì)模式? GoF的23種設(shè)計(jì)模式,其中紫色底色白色文字所標(biāo)示的是應(yīng)該掌握的設(shè)計(jì)模式:創(chuàng)建型模式創(chuàng)建型模式Abstract Factory(抽象工廠模式)(抽象工廠模式)Factory Method(工廠模式)(工廠模式)Prototype(原型模式)(原型模式)Singleton(單態(tài)模式)(單態(tài)模式)Builder(生成器模式)(生成器模式)1 什么是設(shè)計(jì)模式? 結(jié)構(gòu)型模式結(jié)構(gòu)型模式Adapter(適配器模式)(適配器模式)Comp

5、osite(組合模式)(組合模式)Decorator(裝飾模式)(裝飾模式)Bridge(橋接模式)(橋接模式)Faade(外觀模式)(外觀模式)Flyweight(享元模式)(享元模式)Proxy(代理模式)(代理模式)1 什么是設(shè)計(jì)模式? 行為型模式行為型模式Chain of Responsibility(職責(zé)鏈模式)職責(zé)鏈模式)Interpreter(解釋器模式)(解釋器模式)Memento(備忘錄模式)(備忘錄模式)Command(命令模式)(命令模式)Observer(觀察者模式)(觀察者模式)Mediator(中介者模式)(中介者模式)Iteartor(迭代器模式)(迭代器模式)S

6、trategy(策略模式)(策略模式)TemplateMethod(模板方法模式)(模板方法模式)State(狀態(tài)模式)狀態(tài)模式)Visitor(訪問(wèn)者模式)訪問(wèn)者模式)2 工廠模式 Factory Method(工廠方法模式):工廠方法模式又稱工廠模式,也叫虛擬構(gòu)造器模式或者多態(tài)工廠模式,屬于類的創(chuàng)建型模式。在工廠方法模式中,父類負(fù)責(zé)定義創(chuàng)建對(duì)象的公共接口,而子類則負(fù)責(zé)生成具體的對(duì)象,這樣做的目的是將類的實(shí)例化操作延遲到子類中,即由子類來(lái)決定究竟應(yīng)該實(shí)例化哪一個(gè)類。 工廠模式的要點(diǎn): 1、存在一個(gè)創(chuàng)建對(duì)象的工廠; 2、調(diào)用者從工廠中取得某些對(duì)象; 3、由工廠決定如何創(chuàng)建對(duì)象; 4、客戶不知道

7、對(duì)象是如何生成的。 2 工廠模式 工廠方法模式的UML類圖表示:2 工廠模式 2 工廠模式 工廠方法模式實(shí)例手機(jī)工廠現(xiàn)實(shí)中不同品牌的手機(jī)應(yīng)由不同的工廠制造,是一個(gè)典型的工廠方法模式。2 工廠模式 手機(jī)工廠實(shí)現(xiàn)代碼:手機(jī)接口:public interface Mobile void call();手機(jī)工廠接口:public interface MobileFactory Mobile produceMobile();2 工廠模式 摩托羅拉手機(jī)實(shí)現(xiàn)手機(jī)接口:public class Motorola implements Mobilepublic void call() / TODO Auto-g

8、enerated method stubSystem.out.println(摩托羅拉手機(jī));諾基亞手機(jī)實(shí)現(xiàn)手機(jī)接口:public class Nokia implements Mobilepublic void call() / TODO Auto-generated method stubSystem.out.println(諾基亞手機(jī));2 工廠模式 摩托羅拉手機(jī)工廠實(shí)現(xiàn)生產(chǎn)手機(jī)的方法,返回摩托羅拉手機(jī):public class MotorolaFactory implements MobileFactorypublic Mobile produceMobile() System.out

9、.println(摩托羅拉手機(jī)工廠制造了);return new Motorola();諾基亞手機(jī)工廠實(shí)現(xiàn)生產(chǎn)手機(jī)的方法,返回諾基亞手機(jī):public class NokiaFactory implements MobileFactorypublic Mobile produceMobile() System.out.println(諾基亞手機(jī)工廠制造了);return new Motorola();2 工廠模式 客戶端調(diào)用程序:public class Client public static void main(String args)MobileFactory mf;Mobile m;m

10、f=new MotorolaFactory();m=duceMobile();m.call();mf=new NokiaFactory();m=duceMobile();m.call();運(yùn)行結(jié)果:摩托羅拉手機(jī)工廠制造了摩托羅拉手機(jī)諾基亞手機(jī)工廠制造了摩托羅拉手機(jī)2 工廠模式 優(yōu)勢(shì)和缺陷:a. 基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,就正是因?yàn)樗械木唧w工廠類都具有同一抽象父類。b. 使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加

11、入新產(chǎn)品時(shí)無(wú)需修改抽象工廠和抽象產(chǎn)品提供的接口,無(wú)需修改客戶端,也無(wú)需修改其它的具體工廠和具體產(chǎn)品,而只需要添加一個(gè)具體工廠和具體產(chǎn)品就可以了,這樣,系統(tǒng)的可擴(kuò)展性非常的好。優(yōu)秀的面向?qū)ο笤O(shè)計(jì)鼓勵(lì)使用封裝和委托來(lái)構(gòu)造軟件系統(tǒng),工廠方法模式這是使用了封裝和委托的典型例子,其中封裝是通過(guò)抽象工廠來(lái)體現(xiàn)的,而委托則是通過(guò)抽象工廠將創(chuàng)建對(duì)象的責(zé)任完全交給具體工廠來(lái)實(shí)現(xiàn)。c. 使用工廠方法模式的缺電是在添加新產(chǎn)品時(shí),需要編寫(xiě)新的具體產(chǎn)品類,而且還要提供與之對(duì)應(yīng)的具體工廠類,當(dāng)兩者都比較簡(jiǎn)單時(shí),系統(tǒng)會(huì)有相應(yīng)的額外開(kāi)銷。2 工廠模式 應(yīng)用場(chǎng)景:u 類不知道自己要?jiǎng)?chuàng)建哪一個(gè)對(duì)象。u 類用它的子類來(lái)指定創(chuàng)建哪個(gè)

12、對(duì)象。u 客戶需要清楚創(chuàng)建了哪一個(gè)對(duì)象。3 抽象工廠模式 Abstract Factory Pattern(抽象工廠模式):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對(duì)象創(chuàng)建型模式。 抽象工廠模式與工廠方法模式最大的區(qū)別在于:工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),而抽象工廠模式則針對(duì)的是多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。正因如此,在抽象工廠模式中經(jīng)常會(huì)用到產(chǎn)品族這一概念,它指的是位于不同的產(chǎn)品等級(jí)結(jié)構(gòu)中,并且功能相互關(guān)聯(lián)的產(chǎn)品系列。3 抽象工廠模式 抽象工廠模式的UML類圖表示:聲明生成抽象產(chǎn)品的方法執(zhí)行生成抽象產(chǎn)品的方法,生成一個(gè)具體產(chǎn)品為一種產(chǎn)品

13、聲明接口定義具體工廠生成的具體產(chǎn)品的對(duì)象,實(shí)現(xiàn)產(chǎn)品接口應(yīng)用程序,使抽象產(chǎn)品和抽象工廠生成對(duì)象3 抽象工廠模式3 抽象工廠模式 抽象工廠模式實(shí)例電腦產(chǎn)品IBM,Dell都是著名的計(jì)算機(jī)生產(chǎn)廠家,他們采用的主板、硬盤(pán)及CPU是不相同的,但配件間、主板與CPU一定要相互兼容,例如下面例子中的微星MSIK7N2G配AMD的CPU;微星MSI865PE配Intel的CPU。3 抽象工廠模式 電腦產(chǎn)品類圖如下:3 抽象工廠模式CPU接口:public interface CPU String getCPU();AMD類,實(shí)現(xiàn)CPU接口:public class AMD implements CPU pub

14、lic String getCPU() return Athlon xp 2800+;Intel類,實(shí)現(xiàn)CPU接口:public class Intel implements CPU public String getCPU() return P4 3.2G;3 抽象工廠模式硬盤(pán)接口:public interface HardDisk String getSize();Maxtor類,實(shí)現(xiàn)硬盤(pán)接口:public class Maxtor implements HardDisk public String getSize() return MaxLine Plus II 200G;WestDig

15、it類,實(shí)現(xiàn)硬盤(pán)接口:public class WestDigit implements HardDisk public String getSize() return WD2500JD 250G;3 抽象工廠模式主板接口:public interface MainBoard void Attach(CPU cpu) throws Exception;MSI865PE類,實(shí)現(xiàn)主板接口:public class MSI865PE implements MainBoard public void Attach(CPU cpu) throws Exception if (cpu.getClass()

16、.toString().endsWith(Intel)System.out.println(MSI865PE);elsethrow new Exception(主板MSI865PE只能配Intel的CPU);3 抽象工廠模式MSIK7N2G類,實(shí)現(xiàn)主板接口:public class MSIK7N2G implements MainBoard public void Attach(CPU cpu) throws Exception if (cpu.getClass().toString().endsWith(AMD)System.out.println(MSIK7N2G);elsethrow n

17、ew Exception(主板MSIK7N2G只能配AMD的CPU);3 抽象工廠模式定義抽象電腦工廠類:public abstract class ComputerFactory CPU cpu;HardDisk hd;MainBoard mb;public void show()trySystem.out.println(this.getClass().getName().toString()+生產(chǎn)的電腦配置);System.out.println(CPU:+cpu.getCPU();System.out.println(HardDisk:+hd.getSize();System.out.

18、print(MainBoard:);mb.Attach(cpu);catch(Exception e)System.err.println(e.getMessage();3 抽象工廠模式抽象電腦工廠類派生類Dell,定義其返回的系列配件產(chǎn)品:public class Dell extends ComputerFactory Dell()cpu=new AMD();hd=new Maxtor();mb=new MSIK7N2G();抽象電腦工廠類派生類IBM,定義其返回的系列配件產(chǎn)品:public class IBM extends ComputerFactory IBM()cpu=new In

19、tel();hd=new WestDigit();mb=new MSI865PE();3 抽象工廠模式客戶端:public class Client public static void main(String args) / TODO Auto-generated method stubIBM ibm=new IBM();ibm.show();Dell dell=new Dell();dell.show();運(yùn)行結(jié)果:test.IBM生產(chǎn)的電腦配置CPU:P4 3.2GHardDisk:WD2500JD 250GMainBoard:MSI865PEtest.Dell生產(chǎn)的電腦配置CPU:At

20、hlon xp 2800+HardDisk:MaxLine Plus II 200GMainBoard:MSIK7N2G3 抽象工廠模式 優(yōu)勢(shì)和缺陷:a. 抽象工廠模式的主要優(yōu)點(diǎn)是隔離了具體類的生成,使得客戶端不需要知道什么被創(chuàng)建。b. 抽象工廠模式的最大好處是,當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族的對(duì)象。這對(duì)一些需要根據(jù)當(dāng)前環(huán)境來(lái)決定其行為的軟件系統(tǒng)來(lái)說(shuō),是非常實(shí)用的一種設(shè)計(jì)模式。c. 抽象工廠模式的缺電是,在添加新的產(chǎn)品對(duì)象時(shí),難以擴(kuò)展抽象工廠以便生產(chǎn)新種類產(chǎn)品。這是因?yàn)锳bstractFactory接口規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,要支持新

21、種類的產(chǎn)品就意味著要對(duì)該接口進(jìn)行擴(kuò)展,而這將涉及到對(duì)AbstractFactory及其所有子類的修改,顯然有小小的不便,但不重要。3 抽象工廠模式 應(yīng)用場(chǎng)景:u 系統(tǒng)需要屏蔽有關(guān)對(duì)象如何創(chuàng)建、如何組織和如何表示。u 系統(tǒng)需要由關(guān)聯(lián)的多個(gè)對(duì)象來(lái)構(gòu)成。u 有關(guān)聯(lián)的多個(gè)對(duì)象需要一起應(yīng)用并且它們的約束是強(qiáng)迫的(不可分離)。u 你想提供一組對(duì)象而不顯示它們的實(shí)現(xiàn)過(guò)程,只顯示它們的接口。4 單例模式 Singleton(單例模式):?jiǎn)卫J酱_保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單例類,它提供全局訪問(wèn)的方法。單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行

22、創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。提供一個(gè)instance的方法,讓客戶可以使用的唯一實(shí)例。內(nèi)部實(shí)現(xiàn)只生成一個(gè)實(shí)例4 單例模式public class Logger private static Logger logger=new Logger();private Logger()public static Logger getIns()return logger;public void debug(String msg)/.4 單例模式 單例模式實(shí)例系統(tǒng)日志私有靜態(tài)類型的實(shí)例,在第一次使用時(shí)實(shí)例化。私有類型的構(gòu)造函數(shù),不允許用戶實(shí)例化。普通靜態(tài)方法,返回實(shí)例??蛻舳苏{(diào)用方式

23、:public class Clientpublic static void main(String args) Logger.getIns().debug(調(diào)試信息.);4 單例模式4 單例模式 優(yōu)勢(shì)和缺陷:?jiǎn)卫J綖橐粋€(gè)面向?qū)ο蟮膽?yīng)用程序提供了對(duì)象唯一的訪問(wèn)點(diǎn),不關(guān)它實(shí)現(xiàn)何種功能,此種模式都為設(shè)計(jì)及開(kāi)發(fā)團(tuán)隊(duì)提供了共享的概念。然而,Singleton對(duì)象類派生子類就有很大的困難,只有在父類沒(méi)有被實(shí)例化時(shí)才可以實(shí)現(xiàn)。值得注意的是,有些對(duì)象不可以被做成Singleton,比如.Net的數(shù)據(jù)庫(kù)連接對(duì)象(Connnection),整個(gè)應(yīng)用程序共享一個(gè)Connection對(duì)象會(huì)出現(xiàn)連接池溢出錯(cuò)誤。另外

24、,不管.Net還是Java,都提供了自動(dòng)廢物回收的技術(shù),因此,如果實(shí)例化的對(duì)象長(zhǎng)時(shí)間不被利用,系統(tǒng)會(huì)人為它是廢物,自動(dòng)消滅它的資源,下次利用時(shí)又會(huì)被重新實(shí)例化,這種情況下應(yīng)注意其狀態(tài)的丟失問(wèn)題。4 單例模式 應(yīng)用場(chǎng)景:u 系統(tǒng)只需要一個(gè)實(shí)例的對(duì)象。u 客戶調(diào)用類的單個(gè)實(shí)例只允許使用一個(gè)公共訪問(wèn)點(diǎn)。5 裝飾模式 Decorator Pattern(裝飾模式):動(dòng)態(tài)的給一個(gè)對(duì)象增加其職責(zé),就增加對(duì)象功能來(lái)說(shuō),裝飾模式比生成子類實(shí)現(xiàn)更靈活。定義對(duì)象的接口,可以給這些對(duì)象動(dòng)態(tài)增加職責(zé)(方法)。定義具體的對(duì)象,Decorator可以給它增加額外的職責(zé)(方法)。維護(hù)一個(gè)內(nèi)有的Component,并且定義一

25、個(gè)與Component接口一致的接口。具體的裝飾對(duì)象,給內(nèi)在的具體部件對(duì)象增加具體的職責(zé)(方法)。 裝飾模式的UML類圖表示:5 裝飾模式5 裝飾模式 裝飾模式實(shí)例自定義JButton當(dāng)應(yīng)用Java AWT或Swings組件設(shè)計(jì)用戶接口,開(kāi)發(fā)人員通常需要更多有特色的控件,Decorator模式就提供了一個(gè)方法去創(chuàng)造或修改現(xiàn)有的UI控件。假定我們現(xiàn)在需要一個(gè)帶對(duì)角線的按鈕,其最簡(jiǎn)單的類圖如下:5 裝飾模式public class CustomJButton extends JComponent private static final long serialVersionUID = 1L;pro

26、tected JComponent child;public CustomJButton(JComponent component)child=component;this.setLayout(new BorderLayout();this.add(child);component.addFocusListener(new FocusAdapter()public void focusGained(FocusEvent fe)repaint(););public void paint(Graphics g)super.paint(g);int height=this.getHeight();i

27、nt width=this.getWidth();g.setColor(Color.red);g.setFont(new Font(,Font.BOLD,2);g.drawLine(0, 0, width, height); 實(shí)例代碼客戶端調(diào)用方式:public class Test extends JFrameprivate static final long serialVersionUID = 1L;public static void main(String args) new Test().setVisible(true);public Test()setSize(400,200);

28、getContentPane().setLayout(new FlowLayout();getContentPane().add(new CustomJButton(new JButton(Save);5 裝飾模式運(yùn)行結(jié)果:5 裝飾模式 優(yōu)勢(shì)和缺陷:u 裝飾模式提供了比靜態(tài)繼承更好的柔韌性,它允許開(kāi)發(fā)一系列的功能類用來(lái)代替增加對(duì)象的行為,這既不會(huì)污染原來(lái)對(duì)象的源碼,還能使代碼更容易編寫(xiě),使類更具有擴(kuò)展性,因?yàn)樽兓加尚碌难b飾類來(lái)完成。還可以建立連接的裝飾對(duì)象關(guān)系鏈。u 需要注意的是,關(guān)系鏈不易過(guò)長(zhǎng)。關(guān)系鏈太長(zhǎng)會(huì)是系統(tǒng)花費(fèi)較長(zhǎng)時(shí)間用于初始化對(duì)象,同時(shí)信息在鏈中的傳遞也會(huì)浪費(fèi)太多的時(shí)間。這種情況好比物品包裝,包了一層又一層,大包套小包。另外,如果原來(lái)的對(duì)象接口發(fā)生變化,它所有的裝飾類都要修改以匹配它的變化。派生子類會(huì)影響對(duì)象的內(nèi)部,而一個(gè)Decorator只會(huì)影

溫馨提示

  • 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)論