???? 設(shè)計模式 _后一個主題重點(diǎn)講講設(shè)計模式,設(shè)計模式現(xiàn)在已經(jīng)應(yīng)用很廣泛了,可以說是無處不在。設(shè)計模式現(xiàn)在對程序員是非常的重要,甚至到了不懂設(shè)計模式就不算 真正的程序員一樣。不過設(shè)計模式卻又是非常高階的理論,需要有多年的編程經(jīng)驗(yàn)才能真正領(lǐng)悟,所以學(xué)習(xí)起來非常頭痛。因?yàn)樗览矸浅:唵危菂s非常抽象, 候捷老師通過一大堆實(shí)際案例給我們逐個講述了幾個常用的模式的區(qū)別和用法。設(shè)計模式_經(jīng)典_權(quán)威當(dāng)屬著名的有字天書 GoF 的《 Design Patterns 》了,我結(jié)合自己學(xué)習(xí)和實(shí)踐的體會介紹一下幾個模式。 ???? 結(jié)構(gòu)型模式之Composite(合成模式) GoF的定義:Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects.翻譯為中文大致意思是:將對象 (s) 組成為樹狀結(jié)構(gòu),用以表示“局部 - 整體”的層次體系,使得讓 clients 可以以一致的方式對待“單個對象”和“合成對象”。 比較典型的例子就是文件系統(tǒng)中“文件”和“目錄”的關(guān)系,還有Windows窗口系統(tǒng)也是,在一個窗口中還可以開另一個窗口,多個窗口組合成的窗口 還可以當(dāng)作一個窗口放入另一個窗口中,比如在Word中打開多個文檔就是這種情況。Composite模式的好處就是使得clients調(diào)用簡單,可以用 一致的接口處理單個對象或者多個單一對象組合成的對象。 實(shí)例:Java swing library 中 Component , Label , Container就是Composite模式的應(yīng)用。其中 Label 和 Container 都繼承自 Component ,但是Container中只是一個存放Component的數(shù)組,所以Container中就可以放很多Component,比如ScrollPane 就是繼承自Container,它可以放Label,還有List,Scrollbar等等,甚至還可以放一個ScrollPane,所以就達(dá)到了 Composite模式的效果,簡化了 client的使用。 ???? 結(jié)構(gòu)型模式之 Decorator(裝飾模式) GoF 的定義: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. 翻譯為中文大致的意思是:以動態(tài)的方式給一個對象添加一些額外的職責(zé),使得不必進(jìn)行 subclassing 就能擴(kuò)展功能。 Decorator模式與Composite 模式的區(qū)別就是它只內(nèi)含一個 component object field ,而 Composite 則內(nèi)含一個 collection of component field 。 Decorator 負(fù)責(zé)將一個對象“裝飾”起來,做一些“改造或者擴(kuò)展”,提供額外的功能,它只針對一個 class 。而 Composite 是一組“類似”的對象及其容納它們的容器一視同仁,使得 client 更簡單地處理單個對象和一組對象。它們目的不一樣。 實(shí)例: Java IO library 中 BufferedReader , Reader 之間使用的就是 Decorator 模式,其中 BufferedReader 繼承自 Reader ,同時它內(nèi)部含有一個 Reader 引用,它是通過另一個 Reader 對象構(gòu)造而來,因此就為 Reader 提供更多的功能,如帶緩沖的 Reader 。使用非常簡單,只需要如此定義: Reader in = new BufferedReader(new FileReader("test.txt")); 就為文件讀取增加了帶緩沖的 IO 功能,非常方便。還可以多個 Decorator 的類組合使用,可以提供更強(qiáng)大的功能,多使用一下 Java IO library 就會體會到。 ??? 行為模式之Observer(觀察者模式) GoF的定義: Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 翻譯為中文大致意思是:在 objects 之間定義一個“一對多”的依賴關(guān)系,使得當(dāng)這個 object 改變狀態(tài)時,所有依賴它的 objects 都能獲得通知并自動更新。 Observer是用于做“通知”用途的,就像“ publish-subscribe ”,它能夠做到注冊需要通知的對象,并自動通知它們來更新,它們都是被動地被通知,而不是主動觀察。 實(shí)例:MFC 里 CView 和 CDocument 之間就是一個觀察者模式, CView 是 Observer 即觀察者, CDocument 是 Observable 即被觀察者,當(dāng) CDocument 修改后會自動通知所有的 CView 對象來自動更新它們顯示的內(nèi)容,這一點(diǎn)可以用 Word 很容易試出來。還有_新的 Windows 圖形界面框架 WinForm 中的窗口之間消息傳遞等用的也是 Observer 模式,一個窗口發(fā)生改變時會自動通知所有與它有關(guān)系的窗口,來自動更新信息等,這一點(diǎn) Jeffrey Richter 可以作證 行為模式之Template Method(模板方法) GoF的定義:Define the skeleton of an algorithm in an operation, deferring somesteps to subclasses. Template Method lets subclasses redefine certain steps ofan algorithm without changing the algorithm's structure. 翻譯為中文大致意思是:定義一個算法的骨干,延緩其中某些步驟以便在 subclasses 中定義它們。 Template Method 使得 subclasses 在不改變算法的體系結(jié)構(gòu)的前提下得到重新定義算法內(nèi)的某些步驟。 Template Method其實(shí)_常用了,在C++里的應(yīng)用就是使用 virtual function 實(shí)現(xiàn)的,給一個base class 定義一個virtual方法,但是不實(shí)現(xiàn),而是在它的subclasses 中實(shí)現(xiàn)它,這就是Template Method。這個模式的好處顯而易見,就是在你設(shè)計base class的時候并不知道這個方法具體如何實(shí)現(xiàn),但是卻需要在base class里某個地方需要調(diào)用它以完成一個完整的算法,這時候就是需要用這個模式了。 實(shí)例:例子太多了,到處都是。 ???? 行為模式之Strategy(策略模式) GoF的定義: Define a family of algorithms, encapsulate each one, and make theminterchangeable. Strategy lets the algorithm vary independently from client that use it. 翻譯為中文大致意思是:定義一族算法,把每個算法封裝起來,并使它們可以相互替換。 Stategy 使得算法給 client 使用的時候變得完全獨(dú)立。 Strategy模式完全符合 OCP ( Open-Closed Principle ,開閉原則),可以在不需要做 subclass 更不需要修改 base class 的情況下在 Runtime 的時候擴(kuò)展系統(tǒng)的功能,它不像 Template Method 需要 subclass 才能擴(kuò)展新的功能。 實(shí)例: Strategy 典型的應(yīng)用是在薪資系統(tǒng)中,當(dāng)定義 Employee 類的時候,如果使用 Template Method 模式,就無法更改員工領(lǐng)薪資的方式等,比如員工晉升的時候。這時候就需要用 Strategy 模式,在 Employee 中定義一個指針指向具體的 PaymentMethod 對象,如果需要更改領(lǐng)薪資的方式的時候,只需要將它指向新的 PaymentMehtod 實(shí)現(xiàn)就可以了。 ???? 結(jié)構(gòu)模式之Adapter(適配器模式) GoF的定義: Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. 翻譯為中文大致意思是:將一個 class 的接口轉(zhuǎn)換為另外一種 clients 所期望的接口,使得這些 classes 可以更好地協(xié)同工作起來,而不至于因?yàn)閯e的不兼容的問題所影響。 Adapter 模式屬于結(jié)構(gòu)型模式,需要有 Adaptee (被適配者)和 Adaptor (適配器)兩個對象。一般情況下,我們通過繼承( Inheritance )或者合成( Composition )的方式擴(kuò)展類的功能后,會產(chǎn)生很多接口形式不同的類,但是我們想用同樣的方式調(diào)用它們,又不想改造它們(否則違反 OCP 原則),怎么辦呢?這種情況下就需要用到 Adapter 模式了,這些被“改造”的類就叫做 Adaptee ,而我們就需要寫個 Adaptor 類來轉(zhuǎn)調(diào)它們,把調(diào)用的接口改成統(tǒng)一的形式。 實(shí)例:Java IO library 里的InputStreamReader 就是一個 Adapter ,它負(fù)責(zé)將 InputStream 對象轉(zhuǎn)換為 Reader 對象的接口形式,使得用戶可以像使用其它 Reader 一樣的方式來使用InputStream對象,比如
InputStreamReader isr = new InputStreamReader(
new FileInputStream("test.txt"));
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
這就做到了在不改造原來設(shè)計的類的接口的情況,擴(kuò)展了類的應(yīng)用范圍。一般情況下, Adapter 模式需要結(jié)合 Factory 模式和 Proxy 模式來使用,使得接口的訪問更加一致性,更容易改造系統(tǒng)。 ???? 結(jié)構(gòu)模式之Facade(外觀模式) GoF的定義: Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use. 翻譯為中文大致意思是:為一個子系統(tǒng)的一批接口提供一個統(tǒng)一標(biāo)準(zhǔn)的接口, Facade 定義更高層次的接口,使得子系統(tǒng)更容易使用。 Facade 模式我感覺是一個更高層次的 Adapter ,它是用來理順系統(tǒng)之間的關(guān)系,降低系統(tǒng)間的耦合度的常用方法,其實(shí)我們可能在設(shè)計系統(tǒng)的時候就在不知不覺地應(yīng)用這個模式了。大部分將業(yè)務(wù)邏輯層和表示層 分離的框架都是應(yīng)用 Facade 模式實(shí)現(xiàn)的,使得上層使用者完全不必理會底層的實(shí)現(xiàn),卻又有統(tǒng)一的使用界面。 實(shí)例: J2EE EJB 中 Session Bean 就是一種典型的 Facade 模式,即 Session Facade 。它完全將業(yè)務(wù)對象封裝起來, EJB 客戶端訪問 Session Bean 來代替訪問業(yè)務(wù)對象。這就大大簡化了 EJB 的系統(tǒng)結(jié)構(gòu), Session Bean 就是相當(dāng)于一個外觀,也相當(dāng)于一個總管,把業(yè)務(wù)對象都管理起來,不讓客戶端直接“接觸”到它們。
艾威培訓(xùn)(Avtech Institute of Technology),源于美國,始于1998;是北美著名的培訓(xùn)機(jī)構(gòu),公司總部位于美國新澤西州,2000年進(jìn)入中國,以培養(yǎng)國際化的中高端信息人才為己任,專注于國際前沿的新技術(shù)研發(fā)新興行業(yè)的開拓教育,艾威主要的服務(wù)為培訓(xùn)與咨詢兩大類,目前培訓(xùn)的主要產(chǎn)品有:項目管理培訓(xùn)、IT管理培訓(xùn)、IT技術(shù)培訓(xùn)、云計算大數(shù)據(jù)培訓(xùn)、需求管理培訓(xùn)、產(chǎn)品管理培訓(xùn),信息安全類,AI人工智能等....近十類上幾百門的課程的培訓(xùn)與咨詢服務(wù)。 艾威進(jìn)入中國這十八年來已經(jīng)服務(wù)了超過5000多家客戶,獲得了良好的口碑!也成為了眾多500強(qiáng)企業(yè)指定的培訓(xùn)服務(wù)供應(yīng)商. ● 艾威培訓(xùn)(Avtech Institute of Technology),源于美國,始于1998. ● 艾威培訓(xùn)(Avtech Institute of Technology)是Prometric,VUE,PSI等眾多國際認(rèn)證中心授權(quán)的考點(diǎn)