設計模式與用戶界面設計.ppt
《設計模式與用戶界面設計.ppt》由會員分享,可在線閱讀,更多相關《設計模式與用戶界面設計.ppt(139頁珍藏版)》請在裝配圖網上搜索。
軟件工程導論,劉春計算機與信息工程學院軟件工程系,兩種軟件開發(fā)方法,結構化方法,面向對象方法,3,回顧,面向對象設計方法概述系統(tǒng)設計軟件體系結構設計硬件體系結構設計詳細設計對象設計對象持久化設計面向對象的設計原則設計模式,將信息系統(tǒng)中比較關心的對象分層,可分為三層:用戶界面層、業(yè)務層、數據訪問層,再把各層中的一些公共部分提出來:權限管理、異常處理,這樣得到包圖如下:,,軟件體系結構的設計:以信息系統(tǒng)為例,用戶界面層的職責是:與用戶的交互,接收用戶的各種輸入以及輸出各種提示信息或處理結果。對于輸入的數據進行數據校驗,過濾非法數據。向業(yè)務處理對象發(fā)送處理請求。,1、用戶界面層,,,2、業(yè)務處理包,,業(yè)務處理層的職責是:實現各種業(yè)務處理邏輯或處理算法。驗證請求者的權限。向數據訪問對象發(fā)送數據持久化操作的請求。向用戶界面層返回處理結果。,,3、數據訪問包,數據訪問層的職責是:實現數據的持久化操作實現事務處理,,,權限管理的主要職責是:驗證請求者的請求權限提供請求者的權限列表,,注:業(yè)務處理對象通過權限管理對象來驗證權限,4、權限管理包,5、異常處理包,,異常處理的職責:匯報運行時的詳細異常信息記錄異常處理日志,,6、信息系統(tǒng)的體系結構的類圖,,硬件系統(tǒng)體系結構模型顯示硬件的結構,包括不同的節(jié)點和這些節(jié)點之間如何連接,硬件體系結構設計,12,內容提綱,面向對象設計方法概述系統(tǒng)設計軟件體系結構設計硬件體系結構設計詳細設計對象設計對象持久化設計面向對象的設計原則設計模式,主要包括對象設計和對象持久化設計(數據庫設計)對象設計:對象接口設計:確定對象的主要職責(對象倒底應該做什么)屬性和操作的設計:設計屬性的數據結構、類型,以及操作的算法、參數類型、返回值等對象持久化設計:數據對象的存儲和檢索,詳細設計,永久類的存儲設計永久類一般都是實體類,對應的是系統(tǒng)中涉及的數據每一個永久類映射為一個關系表,表格的列或字段對應類的屬性,而行或記錄對應類的實例(對象)關聯(lián)的存儲設計1:1關聯(lián):在一個類對應的表中用外鍵隱含管理1:n關聯(lián):在n端類對應的表中用外鍵隱含關聯(lián)n:n關聯(lián):轉換成1:n管理,然后按照上面的方法進行轉換,基于關系數據庫的對象持久化設計,1:1關聯(lián),,1:n關聯(lián),,17,內容提綱,面向對象設計方法概述系統(tǒng)設計軟件體系結構設計硬件體系結構設計詳細設計對象設計對象持久化設計面向對象的設計原則設計模式,單一職責原則開放-封閉原則接口隔離原則Liskov替換原則依賴倒置原則,面向對象設計原則,一個類只完成某一類功能(職責)盡可能避免出現一個“復合”功能的類——在同一個類中完成多個不同的功能,1、單一職責原則,,,開放?封閉原則:軟件實體類(類、模塊、函數等)應該是可以擴展、但是不可修改的基本思想:不用修改原有類就能擴展一個類的行為,2、開放?封閉原則,什么是不封閉、不開放,如下的模型可以處理月薪制和時薪制職工工資,如果還要增加一種職工類型,其計酬方式不同(如提成制),則必定要修改Employee類,如何改進,利用抽象機制封閉:Employee及其子類是封閉的開放:可以派生新的子類,實現新的需求,Liskov替換原則:子類應當可以替換父類并出現在父類能夠出現的任何地方核心思想:子類型必須能夠替換它們的基類型,該原則能夠知道設計人員正確地進行類的繼承與派生,3、Liskov替換原則,一個違反Liskov原則的例子,正方形是長方形的一種特例,正方形有獨特的行為方式通過覆蓋父類的有關方法來實現子類行為,實際中的使用情況,長方形的使用者按照長方形的特點來調用SetWidth和SetHeight兩個函數,并測試面積,代碼如下:voidtestArea(Rectangle}如果傳遞進來的是Square對象又會如何呢?顯然會出現斷言錯誤,測試失敗。對于客戶程序來說,模型中的層次結構是脆弱的,因為違反了LSP替換原則,Square對象和Rectangle對象的行為方式不相容,4、接口隔離原則,接口隔離原則:采用多個與特定客戶類有關的接口比采用一個通用的涵蓋多個業(yè)務方法的接口更好。對接口的污染設計人員為了節(jié)省接口數目,而經常將一些功能相近或功能相關的接口合并成一個總的接口臃腫的大接口,,,面向過程——自頂向下,逐步求精,形成上對下依賴依賴倒置原則:應用系統(tǒng)中的高層模塊不應依賴于底層模塊;抽象不應該依賴于細節(jié)實現,實現細節(jié)應該依賴于抽象。優(yōu)點:復用、靈活性、易維護,5、依賴倒置原則,,32,內容提綱,面向對象設計方法概述系統(tǒng)設計軟件體系結構設計硬件體系結構設計詳細設計對象設計對象持久化設計面向對象的設計原則設計模式,33,第十一章設計模式與用戶界面設計,34,內容提綱,設計模式概述經典設計模式介紹用戶界面設計,什么是設計模式?,設計模式:描述一個在我們周圍不斷重復發(fā)生的問題,以及該問題的解決方案。,使用設計模式,我們就能一次一次地利用已有方案而不必做重復勞動。,設計模式的起源,軟件設計模式起源于建筑學1977年,建筑大師Alexander出版了《APatternLanguage:Towns,Building,Construction》一書受Alexander的影響,KentBeck和WardCunningham在1987年舉行的一次面向對象的會議上發(fā)表了論文:《在面向對象編程中使用模式》,設計模式的四個基本要素,模式名稱一個助記名,用幾個詞來描述模式的問題、解決方案和效果。問題描述了應該在何時使用模式。它解釋了設計問題和問題存在的前因后果。有時候,問題部分會包括使用模式必須滿足的一系列先決條件。解決方案描述了設計的組成成分,它們之間的相互關系及各自的職責和協(xié)作方式。因為模式就像一個模板,可應用于多種不同場合,所以解決方案并不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象組合)來解決這個問題。效果描述了模式應用的效果及使用模式應權衡的問題。比如模式的使用對系統(tǒng)的靈活性、擴充性或可移植性的影響。,為什么學習設計模式?,學習設計模式不僅可以使我們使用好這些成功的模式,利用已有的設計經驗更重要的是可以使我們更加深刻地理解面向對象的設計思想,非常有利于我們更好地使用面向對象語言解決設計中的問題。,設計模式之四人幫(GOF),GOF:GangofFourErichGamma、RichardHelm、RalphJohnson、JohnVlissides),GOF之書,GOF之書:《DesignPatterns:ElementsofReusableObject-OrientedSoftware》(《設計模式:可復用的面向對象軟件的基本原理》)。該書被廣大喜愛者昵稱為GOF之書,被認為是學習設計模式的必讀著作,GOF之書已經被公認為是設計模式領域的奠基之作。,GOF之23種設計模式,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.職責鏈模式5.命令模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,創(chuàng)建型模式關注的是如何創(chuàng)建對象而不是直接實例化對象,這會使程序在判斷給定情況下創(chuàng)建哪一個對象時更為靈活五種創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式,創(chuàng)建型模式,結構型模式關注的是如何將一組對象組合成更大的結構七種創(chuàng)建型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,結構型模式,行為型模式關注的是如何定義系統(tǒng)內對像間的通信,以及復雜程序中的流程控制十一種創(chuàng)建型模式1.迭代器模式2.觀察者模式3.策略模式4.職責鏈模式5.命令模式6.解釋器模式,行為型模式,7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,45,內容提綱,設計模式概述經典設計模式介紹用戶界面設計,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,參考:清華大學耿祥義JAVA設計模式的課件,經典設計模式:抽象工廠模式,抽象工廠模式:提供一個創(chuàng)建一系列(相互依賴)對象的接口,而無需指定它們具體的類。應用背景:當系統(tǒng)準備為用戶提供一系列相關的對象,又不想讓用戶代碼和創(chuàng)建這些對象的類形成耦合時,就可以使用抽象工廠方法模式來設計系統(tǒng)。抽象工廠模式的關鍵:是在一個抽象類或接口中定義若干個抽象方法,這些抽象方法分別返回某個類的實例,該抽象類或接口讓其子類或實現該接口的類重寫這些抽象方法,為用戶提供一系列相關的對象。,抽象工廠模式的結構,模式的結構中包括四種角色:抽象產品(Prodcut)具體產品(ConcreteProduct)抽象工廠(AbstractFactory)具體工廠(ConcreteFactory),抽象工廠模式的UML圖,抽象工廠模式的應用實例,建立一個系統(tǒng),該系統(tǒng)可以為用戶提供西服套裝(上衣+褲子)和牛仔套裝(上衣+褲子)。,模式結構中每個部分的描述與使用(1/3),1.抽象產品(Product):UpperClothes.javapublicabstractclassUpperClothes{publicabstractintgetChestSize();publicabstractintgetHeight();publicabstractStringgetName();}Trousers.javapublicabstractclassTrousers{publicabstractintgetWaistSize();publicabstractintgetHeight();publicabstractStringgetName();},模式結構中每個部分的描述與使用(1/3),2.具體產品(ConcreteProduct)_1:WesternUpperClothes.javapublicclassWesternUpperClothesextendsUpperClothes{privateintchestSize;privateintheight;privateStringname;WesternUpperClothes(Stringname,intchestSize,intheight){this.name=name;this.chestSize=chestSize;this.height=height;}publicintgetChestSize(){returnchestSize;}publicintgetHeight(){returnheight;}publicStringgetName(){returnname;}},模式結構中每個部分的描述與使用(1/3),2.具體產品(ConcreteProduct)_2:CowboyUpperClothes.javapublicclassCowboyUpperClothesextendsUpperClothes{privateintchestSize;privateintheight;privateStringname;CowboyUpperClothes(Stringname,intchestSize,intheight){this.name=name;this.chestSize=chestSize;this.height=height;}publicintgetChestSize(){returnchestSize;}publicintgetHeight(){returnheight;}publicStringgetName(){returnname;}},模式結構中每個部分的描述與使用(1/3),2.具體產品(ConcreteProduct)_3:WesternTrousers.javapublicclassWesternTrousersextendsTrousers{privateintwaistSize;privateintheight;privateStringname;WesternTrousers(Stringname,intwaistSize,intheight){this.name=name;this.waistSize=waistSize;this.height=height;}publicintgetWaistSize(){returnwaistSize;}publicintgetHeight(){returnheight;}publicStringgetName(){returnname;}},模式結構中每個部分的描述與使用(1/3),2.具體產品(ConcreteProduct)_4:CowboyTrousers.javapublicclassCowboyTrousersextendsTrousers{privateintwaistSize;privateintheight;privateStringname;CowboyTrousers(Stringname,intwaistSize,intheight){this.name=name;this.waistSize=waistSize;this.height=height;}publicintgetWaistSize(){returnwaistSize;}publicintgetHeight(){returnheight;}publicStringgetName(){returnname;}},模式結構中每個部分的描述與使用(1/3),3.抽象工廠(AbstractFactory):ClothesFactory.javapublicabstractclassClothesFactory{publicabstractUpperClothescreateUpperClothes(intchestSize,intheight);publicabstractTrouserscreateTrousers(intwaistSize,intheight);},模式結構中每個部分的描述與使用(1/3),4.具體工廠(ConcreteFactory):BeijingClothesFactory.javapublicclassBeijingClothesFactoryextendsClothesFactory{publicUpperClothescreateUpperClothes(intchestSize,intheight){returnnewWesternUpperClothes("北京牌西服上衣",chestSize,height);}publicTrouserscreateTrousers(intwaistSize,intheight){returnnewWesternTrousers("北京牌西服褲子",waistSize,height);}}ShanghaiClothesFactory.javapublicclassShanghaiClothesFactoryextendsClothesFactory{publicUpperClothescreateUpperClothes(intchestSize,intheight){returnnewWesternUpperClothes("上海牌牛仔上衣",chestSize,height);}publicTrouserscreateTrousers(intwaistSize,intheight){returnnewWesternTrousers("上海牌牛仔褲",waistSize,height);}},模式結構中每個部分的描述與使用(1/3),5.應用_1:Shop.javapublicclassShop{UpperClothescloth;Trouserstrouser;publicvoidgiveSuit(ClothesFactoryfactory,intchestSize,intwaistSize,intheight){cloth=factory.createUpperClothes(chestSize,height);trouser=factory.createTrousers(waistSize,height);showMess();}privatevoidshowMess(){System.out.println("");System.out.println(cloth.getName()+":");System.out.print("胸圍:"+cloth.getChestSize());System.out.println("身高:"+cloth.getHeight());System.out.println(trouser.getName()+":");System.out.print("腰圍:"+trouser.getWaistSize());System.out.println("身高:"+trouser.getHeight());}},模式結構中每個部分的描述與使用(1/3),5.應用_2:Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){Shopshop=newShop();ClothesFactoryfactory=newBeijingClothesFactory();shop.giveSuit(factory,110,82,170);factory=newShanghaiClothesFactory();shop.giveSuit(factory,120,88,180);}},抽象工廠的優(yōu)點,抽象工廠模式可以為用戶創(chuàng)建一系列相關的對象,使得用戶和創(chuàng)建這些對象的類脫耦。在抽象工廠模式中,可以隨時增加“具體工廠”為用戶提供一組相關的對象。,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,經典設計模式:工廠方法模式,工廠方法模式:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類應用背景:當系統(tǒng)準備為用戶提供某個類的子類的實例,又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠方法模式來設計系統(tǒng)抽象工廠模式的關鍵:是在一個接口或抽象類中定義一個抽象方法,該方法返回某個類的子類的實例,該抽象類或接口讓其子類或實現該接口的類通過重寫這個抽象方法返回某個子類的實例,工廠方法模式的結構,模式的結構中包括四種角色:抽象產品(Prodcut)具體產品(ConcreteProduct)構造者(Creator)具體構造者(ConcreteCreator),工廠方法模式的UML圖,工廠方法模式的應用實例,假設有三個筆芯,分別是紅筆芯、藍筆芯和黑筆芯。用戶希望通過圓珠筆來明確筆芯的顏色。,模式結構中每個部分的描述與使用(1/3),1.抽象產品(Product):PenCore.javapublicabstractclassPenCore{Stringcolor;publicabstractvoidwriteWord(Strings);},模式結構中每個部分的描述與使用(2/3),2.具體產品(ConcreteProduct)_1:RedPenCore.javapublicclassRedPenCoreextendsPenCore{RedPenCore(){color="紅色";}publicvoidwriteWord(Strings){System.out.println("寫出"+color+"的字:"+s);}},模式結構中每個部分的描述與使用(3/3),2.具體產品(ConcreteProduct)_2:BluePenCore.javapublicclassBluePenCoreextendsPenCore{BluePenCore(){color="藍色";}publicvoidwriteWord(Strings){System.out.println("寫出"+color+"的字:"+s);}},模式結構中每個部分的描述與使用(4/3),2.具體產品(ConcreteProduct)_3:BlackPenCore.javapublicclassBlackPenCoreextendsPenCore{BlackPenCore(){color="黑色";}publicvoidwriteWord(Strings){System.out.println("寫出"+color+"的字:"+s);}},模式結構中每個部分的描述與使用(5/3),3.構造者(Creator):BallPen.javapublicabstractclassBallPen{BallPen(){System.out.println("生產了一只裝有"+getPenCore().color+"筆芯的圓珠筆");}publicabstractPenCoregetPenCore();//工廠方法},模式結構中每個部分的描述與使用(6/3),4.具體構造者(ConcreteCreator):RedBallPen.javapublicclassRedBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewRedPenCore();}}BlueBallPen.javapublicclassBlueBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBluePenCore();}}BlackBallPen.javapublicclassBlackBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBlackPenCore();}},模式結構中每個部分的描述與使用(7/3),5.應用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){PenCorepenCore;BallPenballPen=newBlueBallPen();penCore=ballPen.getPenCore();penCore.writeWord("你好,很高興認識你");ballPen=newRedBallPen();penCore=ballPen.getPenCore();penCore.writeWord("Howareyou");ballPen=newBlackBallPen();penCore=ballPen.getPenCore();penCore.writeWord("nicetomeetyou");}},工廠方法的優(yōu)點,使用工廠方法可以讓用戶的代碼和某個特定類的子類的代碼解耦。工廠方法使用戶不必知道它所使用的對象是怎樣被創(chuàng)建的,只需知道該對象有哪些方法即可,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,經典設計模式:單例模式,單例模式:保證一個類僅有一個實例(對象),并提供一個訪問它的全局訪問點應用背景:怎樣設計一個類,并使得該類只有一個實例(也即對象)單例模式的關鍵:是將類的構造方法設置為private,并提供一個返回它的唯一實例的類方法。,單例模式的結構,模式的結構中包括一種角色:單例類(Singleton),單例模式的應用實例(1/2),1.單例類(Singleton):Moon.javapublicclassMoon{privatestaticMoonuniqueMoon;doubleradius;doubledistanceToEarth;privateMoon(){uniqueMoon=this;radius=1738;distanceToEarth=363300;}publicstaticMoongetMoon(){if(uniqueMoon==null){uniqueMoon=newMoon();}returnuniqueMoon;}publicStringshow(){Strings="月亮的半徑是"+radius+"km,距地球是"+distanceToEarth+"km";returns;}},單例模式的應用實例(1/2),2.應用Application.javaimportjavax.swing.*;importjava.awt.*;publicclassApplication{publicstaticvoidmain(Stringargs[]){MyFramef1=newMyFrame("張三看月亮");MyFramef2=newMyFrame("李四看月亮");f1.setBounds(10,10,360,150);f2.setBounds(370,10,360,150);f1.validate();f2.validate();}}classMyFrameextendsJFrame{Stringstr;MyFrame(Stringtitle){setTitle(title);Moonmoon=Moon.getMoon();str=moon.show();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);repaint();}publicvoidpaint(Graphicsg){super.paint(g);g.setFont(newFont("宋體",Font.BOLD,14));g.drawString(str,5,100);}},單例模式的優(yōu)點,單例類的唯一實例由單例類本身來控制,所以可以很好地控制用戶何時訪問它,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,經典設計模式:適配器模式,適配器模式:將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。應用背景:如何在不修改代碼的情況下,將一個接口修改為另外一個接口適配器模式的關鍵:是建立一個適配器,這個適配器實現了目標接口并包含有被適配者的引用。,適配器模式的結構,模式的結構中包括三種角色:目標(Target)被適配者(Adaptee)適配器(Adapter),適配器模式的UML圖,適配器模式的優(yōu)點,目標(Target)和被適配者(Adaptee)是完全解耦的關系。適配器模式滿足“開-閉原則”。當添加一個實現Adaptee接口的新類時,不必修改Adapter,Adapter就能對這個新類的實例進行適配。,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,經典設計模式:外觀模式,外觀模式:為系統(tǒng)中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。應用背景:簡化用戶和子系統(tǒng)(包含多個類)的交互外觀模式的關鍵:是為各個子系統(tǒng)提供一個稱作外觀的類,該外觀類的實例負責和各個子系統(tǒng)中類的實例打交道,外觀模式的結構,模式的結構中包括兩種角色:子系統(tǒng)(Subsystem)外觀(Facade),外觀模式的UML圖,外觀模式的應用實例(1/5),報社的廣告系統(tǒng)有三個類CheckWord、Charge和TypeSetting類,各個類的職責如下:CheckWord類負責檢查廣告內容含有的字符數量;Charge類的實例負責計算費用;TypeSetting的實例負責對廣告進行排版,外觀模式的應用實例(2/5),1.子系統(tǒng)(Subsystem)_1:CheckWord.javapublicclassCheckWord{publicfinalintbasicAmount=85;Stringadvertisement;intamount;publicCheckWord(Stringadvertisement){this.advertisement=advertisement;}publicvoidsetChargeAmount(){amount=advertisement.length()+basicAmount;//計算出計費字符數目}publicintgetAmount(){returnamount;}},外觀模式的應用實例(3/5),1.子系統(tǒng)(Subsystem)_2:Charge.javapublicclassCharge{publicfinalintbasicCharge=12;CheckWordcheckWord;Charge(CheckWordcheckWord){this.checkWord=checkWord;}publicvoidgiveCharge(){intcharge=checkWord.getAmount()*basicCharge;System.out.println("廣告費用:"+charge+"元");}},外觀模式的應用實例(4/5),1.子系統(tǒng)(Subsystem)_3:TypeSeting.javapublicclassTypeSeting{Stringadvertisement;publicTypeSeting(Stringadvertisement){this.advertisement=advertisement;}publicvoidtypeSeting(){System.out.println("廣告排版格式:");System.out.println("********");System.out.println(advertisement);System.out.println("********");}},外觀模式的應用實例(5/5),2.外觀(Facade):ClientServerFacade.javapublicclassClientServerFacade{privateCheckWordcheckWord;privateChargecharge;privateTypeSetingtypeSeting;Stringadvertisement;publicClientServerFacade(Stringadvertisement){this.advertisement=advertisement;checkWord=newCheckWord(advertisement);charge=newCharge(checkWord);typeSeting=newTypeSeting(advertisement);}publicvoiddoAdvertisement(){checkWord.setChargeAmount();charge.giveCharge();typeSeting.typeSeting();}},外觀模式的應用實例(6/5),3.應用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){ClientServerFacadeclientFacade;StringclientAdvertisement="鹿花牌洗衣機,價格2356元,聯(lián)系電話:1234567";clientFacade=newClientServerFacade(clientAdvertisement);clientFacade.doAdvertisement();}},外觀模式的優(yōu)點,使客戶和子系統(tǒng)中的類無耦合。外觀只是提供了一個更加簡潔的界面,并不影響用戶直接使用子系統(tǒng)中的類。子系統(tǒng)中任何類對其方法的內容進行修改,不影響外觀的代碼。,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,經典設計模式:迭代器模式,迭代器模式:提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示應用背景:如何高效的遍歷一個集合中的每一個元素迭代器模式的關鍵:是將遍歷集合的任務交給一個稱作迭代器的對象,迭代器模式的結構,模式的結構中包括四種角色:集合(Aggregate)具體集合(ConcreteAggregate)迭代器(Iterator)具體迭代器(ConcreteIterator),迭代器模式的UML圖,迭代器模式的應用實例(1/5),1.集合(Aggregate):在這里我們使用java.util包中的Collection接口作為模式中的集合角色。Java所有的集合都實現了該接口。,2.具體集合(ConcreteAggregate):在這里我們使用java.util包中的HashSet類的實例作為模式中的具體集合角色。,迭代器模式的應用實例(2/5),3.迭代器(Iterator):在本問題中,我們使用的迭代器是java.util包中的Itertator接口。,4.具體迭代器(ConcreteIterator)HashSet創(chuàng)建的集合可以使用iterator()方法返回一個實現Iterator接口類的實例,即一個具體迭代器。,迭代器模式的應用實例(3/5),5.應用Application.java_1importjava.util.*;publicclassApplication{publicstaticvoidmain(Stringargs[]){intn=20;intsum=0;Collectionset=newHashSet();for(inti=1;iiterator=set.iterator();intjia=1,zhen=1;System.out.println("保險箱共有"+set.size()+"張人民幣");intk=0;while(iterator.hasNext()){RenMinMonymoney=iterator.next();k++;if(money.getIsTrue()==false){System.out.println("第"+k+"張是假幣,被銷毀");iterator.remove();k++;}}System.out.println("保險箱現有真人民幣"+set.size()+"張,總價值是:");iterator=set.iterator();while(iterator.hasNext()){RenMinMonymoney=iterator.next();sum=sum+money.getValue();}System.out.println(sum+"元");}},迭代器模式的應用實例(4/5),5.應用Application.java_2classRenMinMony{intvalue;privatebooleanisTrue;RenMinMony(intvalue,booleanb){this.value=value;isTrue=b;}publicbooleangetIsTrue(){returnisTrue;}publicintgetValue(){returnvalue;}},迭代器模式的優(yōu)點,用戶使用迭代器訪問集合中的對象,而不需要知道這些對象在集合中是如何表示及存儲的。用戶可以同時使用多個迭代器遍歷一個集合。,經典設計模式介紹,創(chuàng)建型模式1.抽象工廠模式2.工廠方法模式3.單例模式4.建造者模式5.原型模式結構型模式1.適配器模式2.外觀模式3.橋接模式4.組合模式5.裝飾模式6.享元模式7.代理模式,行為型模式1.迭代器模式2.觀察者模式3.策略模式4.命令模式5.職責鏈模式6.解釋器模式7.中介者模式8.備忘錄模式9.狀態(tài)模式10.模板方法模式11.訪問者模式,經典設計模式:觀察者模式,觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到通知并被自動更新。應用背景:多個對象都對一個特殊對象中的數據變化感興趣,而且這多個對象都希望跟蹤那個特殊對象中的數據變化,觀察者模式的實例,某些尋找工作的人對“求職中心”的職業(yè)需求信息的變化非常關心,很想跟蹤“求職中心”中職業(yè)需求信息的變化?!扒舐氄摺笨梢宰尅扒舐氈行摹卑炎约旱怯浵聛?,這樣求職中心就會及時通知她最新的職業(yè)信息需求。,觀察者模式的結構,模式的結構中包括四種角色:主題(Subject)具體主題(ConcreteSubject)觀察者(Observer)具體觀察者(ConcreteObserver),觀察者模式的UML圖,觀察者模式的應用實例(1/5),某些尋找工作的人對“求職中心”的職業(yè)需求信息的變化非常關心,很想跟蹤“求職中心”中職業(yè)需求信息的變化?!扒舐氄摺笨梢宰尅扒舐氈行摹卑炎约旱怯浵聛?,這樣求職中心就會及時通知她最新的職業(yè)信息需求。,觀察者模式的應用實例(2/5),1.主題:Subject.javapublicinterfaceSubject{publicvoidaddObserver(Observero);publicvoiddeleteObserver(Observero);publicvoidnotifyObservers();publicvoidgiveNewMess();},觀察者模式的應用實例(3/5),2.觀察者:Obsever.javapublicinterfaceObserver{publicvoidhearTelephone(StringheardMess);},觀察者模式的應用實例(3/5),3.具體主題SeekJobCenter.java_1importjava.util.ArrayList;publicclassSeekJobCenterimplementsSubject{Stringmess;booleanchanged;ArrayListpersonList;SeekJobCenter(){personList=newArrayList();mess="";changed=false;}publicvoidaddObserver(Observero){if(!(personList.contains(o)))personList.add(o);}publicvoiddeleteObserver(Observero){if(personList.contains(o))personList.remove(o);},觀察者模式的應用實例(4/5),3.具體主題SeekJobCenter.java_2publicvoidnotifyObservers(){if(changed){for(inti=0;i- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 設計 模式 用戶 界面設計
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.appdesigncorp.com/p-3602416.html