posts - 195, comments - 34, trackbacks - 0, articles - 1

          <設(shè)計(jì)模式:java語(yǔ)言中的應(yīng)用>摘要、總結(jié) 收藏
          <設(shè)計(jì)模式:java語(yǔ)言中的應(yīng)用>一書已經(jīng)學(xué)完,現(xiàn)做個(gè)摘要、總結(jié)。

          創(chuàng)建模式(Creational Patterns)
          Abstract Factory Builder
          Factory Method  Prototype
          Singleton

          結(jié)構(gòu)模式(Structural Patterns)
          Adapter  Bridge
          Composite Decorator
          Facade  Flyweight
          Proxy

          行為模式(Behavioral Pattern)
          Chain of Responsibility  Command
          Interpreter   Iterator
          Mediator   Memento
          Observer   State
          Strategy   Template Method
          Visitor

          一、創(chuàng)建模式(Creational Patterns)

          1.Abstract Factory(抽象工廠)—把相關(guān)零件組合成產(chǎn)品
           Abstract Factory Pattern 是把各種抽象零件組合成抽象產(chǎn)品。換句話說(shuō),處理的重點(diǎn)是在接口(API)而不是零件的具體實(shí)現(xiàn)。只利用接口(API)就能把零件組合成產(chǎn)品.
           程序示例:
           --Main.java 測(cè)試用的類
           |-factory
           |    |-------Factory.java 表示抽象工廠的類(產(chǎn)生Link,Tray,Page)
           |    |-------Itme.java 用來(lái)統(tǒng)一處理Link和Tray的類
           |    |-------Link.java 抽象零件:表示HTML連接的類
           |    |-------Tray.java 抽象零件:抽取Link和Tray的類
           |    |-------Page.java 抽象零件:表示HTML網(wǎng)頁(yè)的類
           |
           |-listfactory
                |-------listFactory.java 表示具體工廠的類(產(chǎn)生ListLink,ListTray,ListPage)
                |-------listLink.java 具體零件:表示HTML連接的類
                |-------listTray.java 具體零件:抽取Link和Tray的類
                |-------listPage.java 具體零件:表示HTML網(wǎng)頁(yè)的類
           步驟:定義抽象零件->用抽象零件定義抽象工廠->定義具體零件(繼承實(shí)現(xiàn)抽象零件)->定義具體工廠(繼承實(shí)現(xiàn)抽象工廠,制造實(shí)際產(chǎn)品)

          2.Factory Method
           Factory Method Pattern 在父類規(guī)定對(duì)象的創(chuàng)建方法,但并沒(méi)有深入到較具體的類名.所有具體的完整內(nèi)容都放在子類.根據(jù)這個(gè)原則,我們可以大致分成產(chǎn)生對(duì)象實(shí)例的大綱(框架)和實(shí)際產(chǎn)生對(duì)象實(shí)例的類兩方面.
           程序示例:
           --Main.java 測(cè)試用的類
           |-framework
           |    |-------Product.java 僅定義抽象方法use的抽象類
           |    |-------Factory.java 規(guī)定createProduct,registerProduct,實(shí)現(xiàn)create的抽象類(類似模板方法)
           |
           |-idcard
                |-------IDCard.java 實(shí)現(xiàn)方法use的具體類
                |-------IDCardFactory.java 實(shí)現(xiàn)方法createProduct,registerProduct的類
           步驟:定義抽象產(chǎn)品->根據(jù)抽象產(chǎn)品定義抽象工廠->定義具體產(chǎn)品(繼承實(shí)現(xiàn)抽象產(chǎn)品)->定義具體工廠(繼承實(shí)現(xiàn)抽象工廠,制造實(shí)際產(chǎn)品)

          3.Singleton(單件)-唯一的對(duì)象實(shí)例
           Singleton Pattern 是針對(duì)一個(gè)類而言. Singleton類只會(huì)產(chǎn)生1個(gè)對(duì)象實(shí)例.Singleton類把singleton定義為static字段(類變量),再以Singleton類的對(duì)象實(shí)例進(jìn)行初始化.這個(gè)初始化的操作僅在加載Singleton類時(shí)進(jìn)行一次.
           Singleton類的構(gòu)造函數(shù)是private的,主要是為了禁止從非Singleton類調(diào)用構(gòu)造函數(shù).即使下面這個(gè)表達(dá)式不在此類之內(nèi),編譯時(shí)仍然會(huì)出現(xiàn)錯(cuò)誤.
            程序示例:
           |--Main.java 測(cè)試用的類
           |--Singleton.java 只有1個(gè)對(duì)象實(shí)例的類
           步驟:定義一個(gè)該類類型的static字段,同時(shí)實(shí)例化->該類的構(gòu)造方法設(shè)為private->定義一個(gè)static的getInstance()方法,返回已經(jīng)實(shí)例化的static字段.

          4.Builder(生成器)-組合復(fù)雜的對(duì)象實(shí)例
           Builder Pattern 是采用循序漸進(jìn)的方式組合較復(fù)雜對(duì)象實(shí)例的.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Builder.java 規(guī)定建立文件時(shí)的方法的抽象類
           |--Director.java 產(chǎn)生1個(gè)文件的類
           |--TextBuilder.java 產(chǎn)生plaintext格式(一般文本格式)的類
           |--HTMLBuilder.java 產(chǎn)生HTML格式的類
           步驟:定義建立文件時(shí)的通用方法(Builder.java)->根據(jù)通用方法組織建立文件(Director.java)->根據(jù)不同需求實(shí)現(xiàn)建立文件的通用方法(TextBuilder.java,HTMLBuilder.java)

          5.Prototype(原型)-復(fù)制建立對(duì)象
           Prototype Pattern 不是利用類產(chǎn)生對(duì)象實(shí)例,而是從一個(gè)對(duì)象實(shí)例產(chǎn)生出另一個(gè)新對(duì)象實(shí)例.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--MessageBox.java 把字符串框起來(lái)use的類.實(shí)現(xiàn)use和createClone
           |--UnderlinePen.java 把字符串加上下劃線的類.實(shí)現(xiàn)use和createCone
           |--framework
                |-------Product.java 已聲明抽象方法use和createClone的接口
                |-------Manager.java 利用createClone復(fù)制對(duì)象實(shí)例的類
           步驟:規(guī)定可復(fù)制產(chǎn)品的接口(Product.java,繼承Cloneable接口)->保存可復(fù)制的產(chǎn)品(以Product類型存以哈西表中),并提供復(fù)制產(chǎn)品的方法create(調(diào)用產(chǎn)品的復(fù)制方法,復(fù)制工作在具體產(chǎn)品類中執(zhí)行)(Manager.java)->定義可復(fù)制的具體產(chǎn)品(UnderlinePen.java,MessageBox.java,實(shí)現(xiàn)復(fù)制產(chǎn)品方法)


          二、結(jié)構(gòu)模式(Structural Patterns)

          1.Adapter(適配器)-換個(gè)包裝再度利用
           Adapter Pattern 把既有的無(wú)法直接利用的內(nèi)容轉(zhuǎn)換成必要的類型后再使用.具有填平"既有內(nèi)容"和"需要結(jié)果"兩者間"落差"的功能.
           Adapter Pattern 有繼承和委托兩種形式.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Banner.java 具有原始功能showWithParen,showWithAster的類
           |--Print.java 所需新功能printWeak,printStrong的接口或抽象類
           |--PrintBanner.java 把原始功能轉(zhuǎn)換成新功能的類
           步驟:
           (繼承)構(gòu)造具有原始功能的類(Banner.java)->定義具有新功能的接口(Print.java)->轉(zhuǎn)換(PrintBanner.java,繼承Banner實(shí)現(xiàn)Print接口,即繼承舊方法實(shí)現(xiàn)新功能)
           (委托)構(gòu)造具有原始功能的類(Banner.java)->定義具有新功能的抽象類(Print.java)->轉(zhuǎn)換(PrintBanner.java,繼承具有新功能的Print類.定義委托對(duì)象,即原始功能類.構(gòu)造時(shí)傳入原始功能實(shí)例對(duì)象,新功能的實(shí)現(xiàn)利用委托對(duì)象的原始功能.)

          2.Bridge(橋接)-分成功能層次和實(shí)現(xiàn)層次
           Bridge Pattern 溝通著"功能的類層次"和"實(shí)現(xiàn)的類層次"
           功能的類層次:給父類增加不同的功能
           實(shí)現(xiàn)的類層次:給父類以不同的實(shí)現(xiàn)
           Bridge Pattern 本質(zhì)上是通過(guò)功能類(最上層的功能類)中的一個(gè)實(shí)現(xiàn)類(最上層的實(shí)現(xiàn)類,一般是抽象類)字段來(lái)橋接兩個(gè)類層次的.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Display.java 功能類層次的最上層類
           |--CountDisplay.java 功能類層次的新增功能類
           |--DisplayImpl.java 實(shí)現(xiàn)類層次的最上層類
           |--StringDisplayImpl.java 實(shí)現(xiàn)類層次的實(shí)現(xiàn)類
           步驟:定義實(shí)現(xiàn)類層次的最上層類(DisplayImpl.java)->定義功能類層次的最上層類(Display.java,使用Adapter Pattern的委托方式把DisplayImpl.java的原始功能轉(zhuǎn)換成Display.java的新功能)->定義功能類層次的新增功能類(CountDisplay.java)->定義實(shí)現(xiàn)類層次的實(shí)現(xiàn)類(StringDisplayImpl.java)

          3.Composite(組成)-對(duì)容器和內(nèi)容一視同仁
           有時(shí)候把容器和內(nèi)容當(dāng)作是同類來(lái)處理會(huì)比較好下手。容器里面可以是內(nèi)容,也可以是更小一號(hào)的容器;而這個(gè)小一號(hào)的容器里還可以再放更小一號(hào)的容器,可以建立出像這樣大套小的結(jié)構(gòu)和遞歸結(jié)構(gòu)的Pattern就是Composite Pattern
           使用Composite Pattern,容器和內(nèi)容必須有一定的共性.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--File.java 表示文件的類
           |--Directory.java 表示目錄的類
           |--Entry.java 對(duì)File和Directory一視同仁的抽象類
           |--FileTreatmentException.java 欲在文件內(nèi)新增Entry時(shí)所發(fā)生的異常類
           步驟:定義異常類(FileTreatmentException.java)->定義進(jìn)入點(diǎn)類,即將容器和內(nèi)容一視同仁的抽象類(Entry.java,容器和內(nèi)容都含有共同的方法)->定義容器類和內(nèi)容類(File.java,Directory.java,繼承Entry,實(shí)現(xiàn)通用方法)

          4.Decorator(裝飾)-對(duì)裝飾和內(nèi)容一視同仁
           先建立一個(gè)核心對(duì)象,再一層層加上裝飾用的功能,就可以完成符合所需的對(duì)象.可以看成是多個(gè)通用的適配器.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Display.java 打印字符串用的抽象類
           |--StringDisplay.java 只有1行的打印字符串用的類
           |--Border.java 表示"裝飾外框"的抽象類
           |--SideBorder.java 只在左右加上裝飾外框的類
           |--FullBorder.java 在上下左右加上裝飾外框的類
           步驟:定義核心對(duì)象的抽象類(Display.java)->定義核心對(duì)象類(StringDisplay.java)->定義裝飾類的抽象類(Border.java,繼承核心對(duì)象的抽象類Display.java,以便裝飾和內(nèi)容一視同仁.裝飾類中繼承自核心對(duì)象抽象類的方法委托給傳入的核心對(duì)象)->定義其它裝飾類(SideBorder.java,FullBorder.java,繼承Border.java)

          5.Facade(外觀)-單一窗口
           Facade Pattern 能整理錯(cuò)綜復(fù)雜的來(lái)龍去脈,提供較高級(jí)的接口(API).Facade參與者讓系統(tǒng)外部看到較簡(jiǎn)單的接口(API).而且Facade參與者還會(huì)兼顧系統(tǒng)內(nèi)部各類功能和互動(dòng)關(guān)系,以最正確的順序利用類.
           Facade Pattern 把業(yè)務(wù)邏輯封裝起來(lái),只提供一個(gè)簡(jiǎn)單的接口給外部調(diào)用.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--maildata.txt 郵件列表文件
           |--pagemaker
                 |-------Database.java 從郵件信箱取得用戶名稱的類
                 |-------HtmlWriter.java 產(chǎn)生HTML文件的類
                 |-------PageMaker.java 根據(jù)郵件信箱產(chǎn)生用戶網(wǎng)頁(yè)的類
           步驟:定義業(yè)務(wù)邏輯需要的相關(guān)類(Database.java,HtmlWriter.java)->定義外部接口類(PageMaker.java)

          6.Flyweight(享元)-有相同的部分就共享,采用精簡(jiǎn)政策
           "盡量共享對(duì)象實(shí)例,不做無(wú)謂的new".不是一需要對(duì)象實(shí)例就馬上new,如果可以利用其他現(xiàn)有的對(duì)象實(shí)例,就讓它們共享.這就是Flyweigth Pattern的核心概念.
           Flyweight Pattern 實(shí)質(zhì)是把創(chuàng)建的占用內(nèi)存量大的對(duì)象存儲(chǔ)起來(lái)(一般用hashtable存儲(chǔ)),后續(xù)使用時(shí),再?gòu)膆ashtable取出.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--BigChar.java 表示"大型字符"的類
           |--BigCharFactory.java 共享并產(chǎn)生BigChar的對(duì)象實(shí)例的類
           |--BigString.java 表示多個(gè)BigChar所產(chǎn)生的"大型文本"的類
           步驟:定義占用內(nèi)存量大,需要共享的類(Display.java)->定義共享實(shí)例的類(BigCharFactory.java,共享處理在此進(jìn)行,將產(chǎn)生的共享對(duì)象存儲(chǔ)在哈希表中,第二次使用時(shí)從表中取出即可,不需要new)->定義共享對(duì)象組合使用類(BigString.java)

          7.Proxy(代理)-需要再建立
           代理就是那個(gè)代替本來(lái)應(yīng)該自己動(dòng)手做事的本人的人.
           由于代理純粹只是代理工作而已,因此能力范圍也有限.如果遇到超出代理能力所及的范圍,代理就應(yīng)該去找本人商量才對(duì).
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Printer.java 表示命名的打印機(jī)的類(本人)
           |--Printable.java Printer和PrinterProxy共享的接口
           |--PrinterProxy.java 表示命名的打印機(jī)的類(代理)
           步驟:定義本人和代理都能處理的問(wèn)題的接口(Printable.java)->建立本人類(Printer.java,實(shí)現(xiàn)Printable.java接口)->建立代理類(PrinterProxy.java,定義本人字段,把代理無(wú)法處理的問(wèn)題交給本人)


          三、行為模式(Behavioral Pattern)

          1.Chain of Responsibility(職責(zé)鏈)-責(zé)任轉(zhuǎn)送
           先對(duì)人產(chǎn)生一個(gè)要求,如果這個(gè)人有處理的能力就處理掉;如果不能處理的話,就把要求轉(zhuǎn)送給"第二個(gè)人".同樣的,如果第二個(gè)人有處理的能力時(shí)就處理掉,不能處理的話,就繼續(xù)轉(zhuǎn)送給"第三個(gè)人",依此類推.這就是Chain of Responsiblility Pattern.
           Chain of Responsibility Pattern 的關(guān)鍵在于定義轉(zhuǎn)送字段(next)和定義職責(zé)鏈.
           程序示例:
           |--Main.java 建立Support的連鎖,產(chǎn)生問(wèn)題的測(cè)試用類
           |--Trouble.java 表示發(fā)生問(wèn)題的類.內(nèi)有問(wèn)題編號(hào).
           |--Support.java 解決問(wèn)題的抽象類.內(nèi)有轉(zhuǎn)送字段和處理方法.
           |--NoSupport.java 解決問(wèn)題的具體類(永遠(yuǎn)"不處理")
           |--LimitSupport.java 解決問(wèn)題的具體類(解決小于指定號(hào)碼的問(wèn)題)
           |--OddSupport.java 解決問(wèn)題的具體類(解決奇數(shù)號(hào)碼的問(wèn)題)
           |--SpecialSupport.java 解決問(wèn)題的具體類(解決特殊號(hào)碼的問(wèn)題)
           步驟:建立問(wèn)題類(Trouble.java)->建立解決問(wèn)題的抽象類(Support.java,定義了轉(zhuǎn)送字段next,設(shè)置轉(zhuǎn)送字段的方法setNext和處理問(wèn)題的方法support)->建立解決問(wèn)題的具體類(NoSupport.java,LimitSupport.java,OddSupport.java,SpecialSupport.java,繼承Support.java)->產(chǎn)生處理問(wèn)題的對(duì)象,建立職責(zé)鏈

          2.Command(命令)-將命令寫成類
           用一個(gè)"表示命令的類的對(duì)象實(shí)例"來(lái)代表欲執(zhí)行的操作,而不需采用"調(diào)用方法"的類的動(dòng)態(tài)處理.如欲管理相關(guān)紀(jì)錄,只需管理該對(duì)象實(shí)例的集合即可.而若預(yù)先將命令的集合存儲(chǔ)起來(lái),還可再執(zhí)行同一命令;或者是把多個(gè)命令結(jié)合成一個(gè)新命令供再利用.
           Command Pattern 重點(diǎn)在于存儲(chǔ)/使用命令
           程序示例:
           --Main.java 測(cè)試用的類
           |-command
           |    |-------Command.java 表示"命令"的接口
           |    |-------MacroCommand.java 表示"結(jié)合多個(gè)命名的命令"的類
           |
           |-drawer
                |-------DrawCommand.java 表示"點(diǎn)的繪制命令"的類
                |-------Drawable.java 表示"繪制對(duì)象"的接口
                |-------DrawCanvas.java 表示"繪制對(duì)象"的類
           步驟:建立命令接口(Command.java)->建立命令結(jié)合類(MacroCommand.java,將各個(gè)命令存儲(chǔ)到一個(gè)Stack類型的字段)->建立繪制命令類(DrawCommand.java,定義繪制對(duì)象字段drawable,實(shí)現(xiàn)命令接口)->建立繪制對(duì)象接口(Drawable.java)->建立繪制對(duì)象類(DrawCanvas.java,實(shí)現(xiàn)繪制對(duì)象接口,定義命令集合字段history)->測(cè)試

          3.Interpreter(解釋器)-以類來(lái)表達(dá)語(yǔ)法規(guī)則
           Interpreter Pattern 是用簡(jiǎn)單的"迷你語(yǔ)言"來(lái)表現(xiàn)程序要解決的問(wèn)題,以迷你語(yǔ)言寫成"迷你程序"而表現(xiàn)具體的問(wèn)題.迷你程序本身無(wú)法獨(dú)自啟動(dòng),必須先用java語(yǔ)言另外寫一個(gè)負(fù)責(zé)"解釋(interpreter)"的程序.解釋程序能分析迷你語(yǔ)言,并解釋\執(zhí)行迷你程序.這個(gè)解釋程序也稱為解釋器.當(dāng)應(yīng)解決的問(wèn)題發(fā)生變化時(shí),要修改迷你程序來(lái)對(duì)應(yīng)處理.而不是修改用java語(yǔ)言寫成的程序.
           迷你語(yǔ)言語(yǔ)法:
           <program>::=program<command list>
           <command list>::=<command>* end
           <command>::=<repeat command>|<primitive command>
           <repeat command>::=repeat<number><command list>
           <primitive command>::=go|right|left
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Node.java 樹(shù)狀剖析中"節(jié)點(diǎn)"的類
           |--ProgramNode.java 對(duì)應(yīng)<program>的類
           |--CommandListNode.java 對(duì)應(yīng)<command list>的類
           |--CommandNode.java 對(duì)應(yīng)<command>的類
           |--RepeatCommandNode.java 對(duì)應(yīng)<repeat command>的類
           |--PrimitiveCommandNode.java 對(duì)應(yīng)<primitive command>的類
           |--Context.java 表示語(yǔ)法解析之前后關(guān)系的類
           |--ParseException.java 語(yǔ)法解析中的例外類
           步驟:確定迷你語(yǔ)言的語(yǔ)法->建立語(yǔ)法解析類(Context.java,使用java.util.StringTokenizer類)->建立解析異常類(ParseException.java)->建立語(yǔ)法節(jié)點(diǎn)抽象類(Node.java,定義parse解析方法)->建立各語(yǔ)法節(jié)點(diǎn)對(duì)應(yīng)的語(yǔ)法類(ProgramNode.java,CommandListNode.java,CommandNode.java,RepeatCommandNode.java,PrimitiveCommand.java,繼承語(yǔ)法節(jié)點(diǎn)Node.java類)

          4.Iterator-迭代器
           Iterator Pattern 是指依序遍歷并處理多個(gè)數(shù)字或變量.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Aggregate.java 表示已聚合的類
           |--Iterator.java 執(zhí)行遞增\遍歷的接口
           |--Book.java 表示書籍的類
           |--BookShelf.java 表示書架的類
           |--BookShelfIterator.java 掃描書架的類
           步驟:定義聚合接口(Aggregate.java)->定義遍歷接口(Iterator.java)->建立具體的遍歷對(duì)象類(Book.java)->建立具體的聚合類(BookShelf.java,實(shí)現(xiàn)聚合接口)->建立具體的遍歷類(BookShelfIterator.java,實(shí)現(xiàn)遍歷接口)

          5.Mediator(中介者)-只要面對(duì)一個(gè)顧問(wèn)
           每個(gè)成員都只對(duì)顧問(wèn)提出報(bào)告,也只有顧問(wèn)會(huì)發(fā)出指示給各個(gè)成員;成員們彼此也不會(huì)去探問(wèn)目前狀況如何,或亂發(fā)指示給其他成員.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Mediator.java 決定"顧問(wèn)"接口(API)的接口
           |--Colleague.java 決定"成員"接口(API)的接口
           |--ColleagueButton.java 實(shí)現(xiàn)Colleagues接口.表示按鍵的類
           |--ColleagueTextField.java 實(shí)現(xiàn)Colleagues接口.輸入文本的類
           |--ColleagueCheckbox.java 實(shí)現(xiàn)Colleagues接口.表示選擇項(xiàng)目(在此為選擇按鈕)的類
           |--LoginFrame.java 實(shí)現(xiàn)Mediator接口.表示登錄對(duì)話框的類
           步驟:定義顧問(wèn)接口(Mediator.java)->定義成員接口(Colleague.java)->建立具體的成員類(ColleagueButton.java,ColleagueTextField.java,ColleagueCheckbox.java,實(shí)現(xiàn)成員接口)->建立具體的顧問(wèn)類(LoginFrame.java,實(shí)現(xiàn)顧問(wèn)接口)

          6.Memento(備忘錄)-存儲(chǔ)狀態(tài)
           Memento Pattern 會(huì)把某個(gè)時(shí)間點(diǎn)的對(duì)象實(shí)例狀態(tài)記錄存儲(chǔ)起來(lái),等到以后再讓對(duì)象實(shí)例復(fù)原到當(dāng)時(shí)的狀態(tài).
           程序示例:
           |--Main.java 進(jìn)行游戲的類.先把Memento的對(duì)象實(shí)例存儲(chǔ)起來(lái),如有必要時(shí)再?gòu)?fù)原Gamer的狀態(tài)
           |--game
               |-------Gamer.java 玩游戲的主人翁的類
               |-------Memento.java 表示Gamer狀態(tài)的類.產(chǎn)生Memento的對(duì)象實(shí)例
           步驟:建立需要存儲(chǔ)狀態(tài)的類(Gamer.java)->建立狀態(tài)類(Memento.java,狀態(tài)類與需要存儲(chǔ)狀態(tài)的類Gamer.java應(yīng)具有相同的必要字段)

          7.Observer(觀察者)-通知狀態(tài)變化
           當(dāng)被Observer Pattern 列入觀察名單的狀態(tài)發(fā)生變化,就會(huì)通知觀察者.在寫一些跟狀態(tài)變化有關(guān)的處理時(shí),Observer Pattern是很好用的工具.
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Observer.java 表示觀察者的接口
           |--NumberGenerator.java 表示產(chǎn)生數(shù)值對(duì)象的抽象類
           |--RandomNumberGenerator.java 產(chǎn)生隨機(jī)數(shù)的類
           |--DigitObserver.java 以數(shù)字表示數(shù)值的類
           |--GraphObserver.java 以簡(jiǎn)易長(zhǎng)條圖表示數(shù)值的類
           步驟:定義觀察者接口(Observer.java)->建立被觀察的類(NumberGenerator.java,RandomNumberGenerator.java,定義觀察者結(jié)合字段將觀察者存儲(chǔ)起來(lái))->建立具體的觀察者類(DigitObserver.java,GraphObserver.java,實(shí)現(xiàn)觀察者接口)

          8.State(狀態(tài))-以類表示狀態(tài)
           以類來(lái)表示狀態(tài)之后,只要切換類就能表現(xiàn)“狀態(tài)變化”,而且在必須新增其他狀態(tài)時(shí),也很清楚該編寫哪個(gè)部分。
           程序示例:
           |--Main.java 測(cè)試用的類
           |--State.java 表示金庫(kù)狀態(tài)的接口
           |--DayState.java 實(shí)現(xiàn)State的類。表示白天的狀態(tài)
           |--NightState.java 實(shí)現(xiàn)State的類。表示夜間的狀態(tài)
           |--Context.java 管理金庫(kù)的狀態(tài)變化,跟保安中心聯(lián)絡(luò)的接口
           |--SafeFrame.java 實(shí)現(xiàn)Context的類。含有按鈕、畫面顯示等的用戶接口
           步驟:定義狀態(tài)接口(State.java,將使用State Pattern之前各種行為方法抽象出來(lái))->建立具體的狀態(tài)類(DayState.java,NightState.java,實(shí)現(xiàn)狀態(tài)接口,狀態(tài)變化的具體動(dòng)作在這里執(zhí)行)->定義管理狀態(tài)變化的接口(Context.java,規(guī)定狀態(tài)變化及相關(guān)的調(diào)用方法)->建立狀態(tài)管理類(SafeFrame.java,實(shí)現(xiàn)狀態(tài)管理接口)

          9.Strategy(策略)-把算法整個(gè)換掉
           在Strategy Pattern之下,可以更換實(shí)現(xiàn)算法的部分而且不留痕跡。切換整個(gè)算法,簡(jiǎn)化改為采用其他方法來(lái)解決同樣的問(wèn)題。
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Hand.java 表示猜拳“手勢(shì)”的類
           |--Strategy.java 表示猜拳“戰(zhàn)略”的接口
           |--WinningStrategy.java 表示猜贏之后繼續(xù)出同樣招式的戰(zhàn)略的類
           |--ProbStrategy.java 表示從上一次出的招式,以概率分配方式求出下一個(gè)招式機(jī)率的類
           |--Player.java 表示玩猜拳的游戲者的類
           步驟:定義策略接口(Strategy.java)->建立具體的策略類(WinningStrategy.java,ProbStrategy.java,實(shí)現(xiàn)策略接口)->建立使用策略的類(Player.java,定義策略字段,以便使用切換策略)->建立其它類(Main.java,Hand.java)

          10.Template Method(模板方法)-實(shí)際處理交給子類
           在父類指定處理大綱、在子類規(guī)定具體內(nèi)容的Design Pattern就稱為Template Method Pattern
           程序示例:
           |--Main.java 測(cè)試用的類
           |--AbstractDisplay.java 只實(shí)現(xiàn)方法display的抽象類
           |--CharDisplay.java 實(shí)現(xiàn)方法open,print,close的類
           |--StringDisplay.java 實(shí)現(xiàn)方法open,print,close的類
           步驟:定義模板類(AbstractDisplay.java,實(shí)現(xiàn)dispaly方法,即制作了模板)->建立具體內(nèi)容類(CharDisplay.java,StringDisplay.java,繼承模板類,實(shí)現(xiàn)模板類沒(méi)有實(shí)現(xiàn)的方法)

          11.Visitor(訪問(wèn)者)-在結(jié)構(gòu)中穿梭還同時(shí)做事
           Visitor Pattern 把數(shù)據(jù)結(jié)構(gòu)和處理兩者分開(kāi),另外寫一個(gè)表示在數(shù)據(jù)結(jié)構(gòu)內(nèi)穿梭來(lái)去的主體“訪客”的類,然后把處理交給這個(gè)類來(lái)進(jìn)行。如此一來(lái),如果想追加新的處理行為時(shí),只要再建立一個(gè)新的“訪客”即可。而在數(shù)據(jù)結(jié)構(gòu)這邊,也只要能接受來(lái)敲門的“訪客”就能完成動(dòng)作。
           在父類指定處理大綱、在子類規(guī)定具體內(nèi)容的Design Pattern就稱為Template Method Pattern
           程序示例:
           |--Main.java 測(cè)試用的類
           |--Visitor.java 表示訪問(wèn)文件或目錄的訪客的抽象類
           |--Acceptor.java 表示接受Visitor類的對(duì)象實(shí)例的數(shù)據(jù)結(jié)構(gòu)的接口
           |--ListVisitor.java Visitor類的子類,打印文件和目錄信息的類
           |--Entry.java File和Directory的父類的抽象類(實(shí)現(xiàn)Acceptor接口)
           |--File.java 表示文件的類
           |--Directory.java 表示目錄的類
           |--FileTreatmentException.java 發(fā)生在對(duì)File進(jìn)行add時(shí)的例外類
           步驟:定義訪問(wèn)者的抽象類(Visitor.java,定義訪問(wèn)方法)->定義受訪者接口(Acceptor.java,定義接受訪問(wèn)的方法)->建立具體的訪問(wèn)者類(ListVisitor.java,繼承訪問(wèn)者抽象類,實(shí)現(xiàn)訪問(wèn)方法)->建立具體的受訪者類(Entry.java,File.java,Directory.java,實(shí)現(xiàn)受訪者接口)->編寫異常類(FileTreatmentException.java)

           

          本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/pian_yun/archive/2007/09/14/1784981.aspx



          主站蜘蛛池模板: 沐川县| 含山县| 武隆县| 临高县| 武宁县| 扶沟县| 依安县| 宁远县| 宣威市| 堆龙德庆县| 洪雅县| 雷州市| 莱州市| 察哈| 江口县| 五大连池市| 青龙| 阜阳市| 沧州市| 梓潼县| 白山市| 崇阳县| 镇安县| 无为县| 兴宁市| 贵州省| 宜兰县| 宝应县| 枝江市| 罗定市| 清镇市| 小金县| 清水河县| 察隅县| 中山市| 闸北区| 财经| 玉屏| 新宁县| 瑞金市| 新巴尔虎左旗|