蘇州JAVA專業(yè)程序員培訓(xùn)?
來源:教育聯(lián)展網(wǎng) 編輯:佚名 發(fā)布時間:2018-04-08
蘇州JAVA專業(yè)程序員培訓(xùn)
一個專業(yè)的程序員,總是把代碼的清晰性,兼容性,可移植性放在很重要的位置。他們總是**定義大量的宏,來增強代碼的清晰度和可讀性,而又不增加編譯后的代碼長度和代碼的運行效率。
他們總是在編碼的同時,就考慮到了以后的代碼維護和升級。甚至,只要分析百分之一的代碼后,你就會深刻地體會到,什么樣的代碼才是一個專業(yè)的程序員寫的,什么樣的代碼是一個業(yè)余愛好者寫的。
而這一點是任何沒有真正分析過標準代碼的人都無法體會到的。
本文會介紹一些經(jīng)典的設(shè)計模式思想:
Proxy代理模式
代理模式:為其他對象提供一種代理以便控制對這個對象的訪問。
可以詳細控制訪問某個類(對象)的方法,在調(diào)用這個方法前作的前置處理(統(tǒng)一的流程代碼放到代理中處理)。調(diào)用這個方法后做后置處理。
代理模式分類:
1.靜態(tài)代理(靜態(tài)定義代理類,我們自己靜態(tài)定義的代理類。比如我們自己定義一個明星的經(jīng)紀人類)
2.動態(tài)代理(**程序動態(tài)生成代理類,該代理類不是我們自己定義的。而是由程序自動生成)比較重要??!
JDK自帶的動態(tài)代理
javaassist字節(jié)碼操作庫實現(xiàn)
CGLIB
ASM(底層使用指令,可維護性較差)
結(jié)構(gòu)組成
代理模式主要涉及到三個角色:抽象角色、代理角色、真實角色(被代理的角色)。
抽象角色:聲明真實對象和代理對象的共同接口。即真實對象和代理對象共同要實現(xiàn)的行為動作(好比房東和中介都要能夠?qū)崿F(xiàn)租房的行為,都能把房子租給你)。
代理角色:代理角色內(nèi)部含有對真實角色的引用,從而可以去操作真實對象,同時代理對象提供與真實對象的接口,以便在任何時候都能代替真實對象。同時,代理對象在執(zhí)行真實對象的操作時,也能附加它自己的操作,相當于對真實對象的封裝
真實角色:代理角色所代理的對象,亦即我們**終要引用的對象。
Factory工廠模式
工廠模式主要是為創(chuàng)建對象提供過渡接口,以便將創(chuàng)建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
工廠模式可以分為三類:
簡單工廠模式(Simple Factory)
工廠方法模式(Factory Method)
抽象工廠模式(Abstract Factory)
這三種模式從上到下逐步抽象,并且更具一般性。GOF在《設(shè)計模式》一書中將工廠模式分為兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。將簡單工廠模式(Simple Factory)看為工廠方法模式的一種特例,兩者歸為一類。
區(qū)別:
工廠方法模式:
一個抽象產(chǎn)品類,可以派生出多個具體產(chǎn)品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例。
抽象工廠模式:
多個抽象產(chǎn)品類,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類。
一個抽象工廠類,可以派生出多個具體工廠類。
每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實例。
區(qū)別:
工廠方法模式只有一個抽象產(chǎn)品類,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例,而抽象工廠模式可以創(chuàng)建多個。
Singleton 單例模式
單例模式只能有一個實例。
單例類必須創(chuàng)建自己的**實例。
單例類必須向其他對象提供這一實例。
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
單例模式結(jié)構(gòu)圖
單例模式(Singleton)是幾個創(chuàng)建模式中**對立的一個,它的主要特點不是根據(jù)用戶程序調(diào)用生成一個新的實例,而是控制某個類型的實例**性,**上圖我們知道它包含的角色只有一個,就是Singleton,它擁有一個私有構(gòu)造函數(shù),這確保用戶無法**new直接實例它。
除此之外,該模式中包含一個靜態(tài)私有成員變量instance與靜態(tài)公有方法Instance()。Instance()方法負責檢驗并實例化自己,然后存儲在靜態(tài)成員變量中,以確保只有一個實例被創(chuàng)建。
使用Singleton模式有一個必要條件:在一個系統(tǒng)要求一個類只有一個實例時才應(yīng)當使用單例模式。反之,如果一個類可以有幾個實例共存,就不要使用單例模式。
不要使用單例模式存取全局變量。這違背了單例模式的用意,**放到對應(yīng)類的靜態(tài)成員中。
不要將數(shù)據(jù)庫連接做成單例,因為一個系統(tǒng)可能會與數(shù)據(jù)庫有多個連接,并且在有連接池的情況下,應(yīng)當盡可能及時釋放連接。Singleton模式由于使用靜態(tài)成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。
Delegate 委派模式
委派模式(Delegate)是面向?qū)ο笤O(shè)計模式中常用的一種模式。這種模式的原理為類B和類A是兩個互相沒有任何關(guān)系的類,B具有和A一模一樣的方法和屬性;并且調(diào)用B中的方法,屬性就是調(diào)用A中同名的方法和屬性。
B好像就是一個受A授權(quán)委托的中介。第三方的代碼不需要知道A的存在,也不需要和A發(fā)生直接的聯(lián)系,**B就可以直接使用A的功能,這樣既能夠使用到A的各種公能,又能夠很好的將A保護起來了。
委派模式的優(yōu)點:
單一一個類無法表現(xiàn)復(fù)雜的設(shè)計
設(shè)計拆分
方便重用
相對獨立
功能定義清晰,行為界面分離
松散耦合,容易擴展
strategy 策略模式
定義一系列的算法,把每一個算法封裝起來, 并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。也稱為政策模式(Policy)。(Definea family of algorithms,encapsulate each one, andmake them interchangeable. Strategy lets the algorithmvary independently from clients that use it. )
策略模式把對象本身和運算規(guī)則區(qū)分開來,其功能非常強大,因為這個設(shè)計模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡缘乃枷搿?/span>
當存在以下情況時使用Strategy模式
許多相關(guān)的類僅僅是行為有異。 “策略”提供了一種用多個行為中的一個行為來配置一個類的方法。即一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
需要使用一個算法的不同變體。例如,你可能會定義一些反映不同的空間 /時間權(quán)衡的算法。當這些變體實現(xiàn)為一個算法的類層次時 ,可以使用策略模式。
算法使用客戶不應(yīng)該知道的數(shù)據(jù)??墒褂貌呗阅J揭员苊獗┞稄?fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
一個類定義了多種行為 , 并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn)。將相關(guān)的條件分支移入它們各自的Strategy類中以代替這些條件語句。
Prototype 原型模式
原型模式的主要思想是基于現(xiàn)有的對象克隆一個新的對象出來,一般是有對象的內(nèi)部提供克隆的方法,**該方法返回一個對象的副本,這種創(chuàng)建對象的方式,相比我們之前說的幾類創(chuàng)建型模式還是有區(qū)別的,之前的講述的工廠模式與抽象工廠都是**工廠封裝具體的new操作的過程,返回一個新的對象,有的時候我們**這樣的創(chuàng)建工廠創(chuàng)建對象不值得,特別是以下的幾個場景的時候,可能使用原型模式更簡單也效率更高。
當一個系統(tǒng)應(yīng)該獨立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時,要使用 Prototype模式
當要實例化的類是在運行時刻指定時,例如,**動態(tài)裝載;
為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時
當一個類的實例只能有幾個不同狀態(tài)組合中的一種時。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。(也就是當我們在處理一些對象比較簡單,并且對象之間的區(qū)別很小,可能只是很固定的幾個屬性不同的時候,可能我們使用原型模式更合適)。
Template 模板模式
模板方法模式是一種類的行為型模式,在它的結(jié)構(gòu)圖中只有類之間的繼承關(guān)系,沒有對象關(guān)聯(lián)關(guān)系。
板方法模式是基于繼承的代碼復(fù)用基本技術(shù),模板方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計的核心之一。在模板方法模式中,可以將相同的代碼放在父類中,而將不同的方法實現(xiàn)放在不同的子類中。
在模板方法模式中,我們需要準備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實現(xiàn),然后聲明一些抽象方法來讓子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn),這就是模板方法模式的用意。模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較高的模式。
模板方法應(yīng)用于下列情況:
一次性實現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實現(xiàn)。
各子類中公共的行為應(yīng)被提取出來并集中到一個公共父類中以避免代碼重復(fù)。首先識別現(xiàn)有代碼中的不同之處,并且將不同之處分離為新的操作。**后,用一個調(diào)用這些新的操作的模板方法來替換這些不同的代碼。全文中源碼分析可以在群619881427免費學(xué)習(xí)。感興趣的可以加入進來。
控制子類擴展。模板方法只在特定點調(diào)用“ hook”操作 ,這樣就只允許在這些點進行擴展。
咨詢聯(lián)系方式:13861302024(楊老師)或者QQ:2589245390 還可以直接在線咨詢
更多JAVA課程推薦:
常用設(shè)計模式
免費體驗課開班倒計時
稍后會有專業(yè)老師給您回電,請保持電話暢通