當前位置:首頁 » 編程語言 » java裝飾器

java裝飾器

發布時間: 2023-08-13 02:39:10

java的i/o類中有哪些用到了裝飾者模式

裝飾者模式用來擴展對象的功能,給對象添加不同的功能。
在io流中,比如
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/text.txt"))));
這種對File類的包裝,由談陸內層到外層擴展敏凳輸入流的功能,就是一個典型的裝飾者模式含拿頃。inputstream是被裝飾對象,然後Fileinputstream、InputStream、BufferedReader都是它的裝飾器,用來擴展它的功能!

❷ Java開發中的23種設計模式詳解(轉)_Java開發模式

設計模式(Design Patterns)

——可復用面向對象軟體的基礎

設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編制真正工程猜模喚化,設計模式是軟體工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設計模式可以完美的解決很多問題,每種模式在現在中都有相應的原理來與之對應,每一個模式描述了一個在我們周圍不斷重復發生的問題,以及該問題的核心解決方案,這也是它能被廣泛應用的原因。

一、設計模式的分類

總體來說設計模式分為三大類:

創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、碼敬外觀模式、橋接模式、組合模式、享元模式。

行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

其實還有兩類:並發型模式和線程池模式。用一個圖片來整體描述一下:

二、設計模式的六大原則

1、開閉原則(Open Close Principle)

開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。所以一句話概括就是:為了使程序的擴展性好,易於維護和升級。想要達到這樣的效果,我們需要使用介面和抽象類,後面的具體設計中我們會提到這點。

2、里氏代換原則(Liskov Substitution Principle)

里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。

里氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。

LSP是繼承復用的基石,只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。里氏代換原則是對「開-閉」原則的補充。實現「開-閉」原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范。—— From Bai 網路

3、依賴倒轉原則(Dependence Inversion Principle)

這個是開閉原則的基礎,具體內容:真對介面編程,依賴於抽象而不依賴於具體。

4、介面隔離原則(Interface Segregation Principle)

這個原則的意思是:使用多個隔離的介面,比使用單個介面要好。還是一個降低類之間的耦合度的意思,從這兒我們看出,其實設計模式就是一個軟體的設計思想,從大型軟體架構出發,為了升級和維護方便。所以上文中多次出現:降低依賴,降低耦合。

5、迪米特法則(最少知道原則)(Demeter Principle)

為什麼叫最少知道原則,就是說:一個實體應當盡量穗凱少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立。

6、合成復用原則(Composite Reuse Principle)

原則是盡量使用合成/聚合的方式,而不是使用繼承。

三、Java的23中設計模式

從這一塊開始,我們詳細介紹Java中23種設計模式的概念,應用場景等情況,並結合他們的特點及設計模式的原則進行分析。

1、工廠方法模式(Factory Method)

工廠方法模式分為三種:

11、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行實例的創建。首先看下關系圖:

舉例如下:(我們舉一個發送郵件和簡訊的例子)

首先,創建二者的共同介面:
[java]view plain publicinterfaceSender{publicvoidSend();}
其次,創建實現類:
[java]view plain {@OverridepublicvoidSend(){System.out.println("thisismailsender!");}} [java]view plain {@OverridepublicvoidSend(){System.out.println("thisissmssender!");}}
最後,建工廠類:
[java]view plain publicclassSendFactory{publicSenderproce(Stringtype){if("mail".equals(type)){returnnewMailSender();}elseif("sms".equals(type)){returnnewSmsSender();}else{System.out.println("請輸入正確的類型!");returnnull;}}}
我們來測試下:
publicclassFactoryTest{publicstaticvoidmain(String[]args){SendFactoryfactory=newSendFactory();Sendersender=factory.proce("sms");sender.Send();}}
輸出:this is sms sender!

22、多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字元串出錯,則不能正確創建對象,而多個工廠方法模式是提供多個工廠方法,分別創建對象。關系圖:

將上面的代碼做下修改,改動下SendFactory類就行,如下:
[java]view plainpublicclassSendFactory{publicSenderproceMail(){ returnnewMailSender();}publicSenderproceSms(){returnnewSmsSender();}}
測試類如下:
[java]view plain publicclassFactoryTest{publicstaticvoidmain(String[]args){SendFactoryfactory=newSendFactory();Sendersender=factory.proceMail();sender.Send();}}
輸出:this is mailsender!

33、靜態工廠方法模式,將上面的多個工廠方法模式里的方法置為靜態的,不需要創建實例,直接調用即可。
[java]view plain publicclassSendFactory{publicstaticSenderproceMail(){returnnewMailSender();}publicstaticSenderproceSms(){returnnewSmsSender();}} [java]view plain publicclassFactoryTest{publicstaticvoidmain(String[]args){Sendersender=SendFactory.proceMail();sender.Send();}}
輸出:this is mailsender!

總體來說,工廠模式適合:凡是出現了大量的產品需要創建,並且具有共同的介面時,可以通過工廠方法模式進行創建。在以上的三種模式中,第一種如果傳入的字元串有誤,不能正確創建對象,第三種相對於第二種,不需要實例化工廠類,所以,大多數情況下,我們會選用第三種——靜態工廠方法模式。

2、抽象工廠模式(Abstract Factory)

工廠方法模式有一個問題就是,類的創建依賴工廠類,也就是說,如果想要拓展程序,必須對工廠類進行修改,這違背了閉包原則,所以,從設計角度考慮,有一定的問題,如何解決?就用到抽象工廠模式,創建多個工廠類,這樣一旦需要增加新的功能,直接增加新的工廠類就可以了,不需要修改之前的代碼。因為抽象工廠不太好理解,我們先看看圖,然後就和代碼,就比較容易理解。

請看例子:
[java]view plain publicinterfaceSender{publicvoidSend();}
兩個實現類:
[java]view plain {@OverridepublicvoidSend(){System.out.println("thisismailsender!");}} [java]view plain {@OverridepublicvoidSend(){System.out.println("thisissmssender!");}}
兩個工廠類:
[java]view plain {@OverridepublicSenderproce(){returnnewMailSender();}} [java]view plain {@OverridepublicSenderproce(){returnnewSmsSender();}}
在提供一個介面:
[java]view plain publicinterfaceProvider{publicSenderproce();}
測試類:
[java]view plain publicclassTest{publicstaticvoidmain(String[]args){Providerprovider=newSendMailFactory();Sendersender=provider.proce();sender.Send();}}
其實這個模式的好處就是,如果你現在想增加一個功能:發及時信息,則只需做一個實現類,實現Sender介面,同時做一個工廠類,實現Provider介面,就OK了,無需去改動現成的代碼。這樣做,拓展性較好!

3、單例模式(Singleton)

單例對象(Singleton)是一種常用的設計模式。在Java應用中,單例對象能保證在一個JVM中,該對象只有一個實例存在。這樣的模式有幾個好處:

1、某些類創建比較頻繁,對於一些大型的對象,這是一筆很大的系統開銷。

2、省去了new操作符,降低了系統內存的使用頻率,減輕GC壓力。

3、有些類如交易所的核心交易引擎,控制著交易流程,如果該類可以創建多個的話,系統完全亂了。(比如一個軍隊出現了多個司令員同時指揮,肯定會亂成一團),所以只有使用單例模式,才能保證核心交易伺服器獨立控制整個流程。

首先我們寫一個簡單的單例類:
[java]view plain publicclassSingleton{/*持有私有靜態實例,防止被引用,此處賦值為null,目的是實現延遲載入*/=null;/*私有構造方法,防止被實例化*/privateSingleton(){}/*靜態工程方法,創建實例*/(){if(instance==null){instance=newSingleton();}returninstance;}/*如果該對象被用於序列化,可以保證對象在序列化前後保持一致*/publicObjectreadResolve(){returninstance;}}
這個類可以滿足基本要求,但是,像這樣毫無線程安全保護的類,如果我們把它放入多線程的環境下,肯定就會出現問題了,如何解決?我們首先會想到對getInstance方法加synchronized關鍵字,如下:
[java]view plain (){if(instance==null){instance=newSingleton();}returninstance;}
但是,synchronized關鍵字鎖住的是這個對象,這樣的用法,在性能上會有所下降,因為每次調用getInstance(),都要對對象上鎖,事實上,只有在第一次創建對象的時候需要加鎖,之後就不需要了,所以,這個地方需要改進。我們改成下面這個:
[java]view plain (){if(instance==null){synchronized(instance){if(instance==null){instance=newSingleton();}}}returninstance;}
似乎解決了之前提到的問題,將synchronized關鍵字加在了內部,也就是說當調用的時候是不需要加鎖的,只有在instance為null,並創建對象的時候才需要加鎖,性能有一定的提升。但是,這樣的情況,還是有可能有問題的,看下面的情況:在Java指令中創建對象和賦值操作是分開進行的,也就是說instance = new Singleton();語句是分兩步執行的。但是JVM並不保證這兩個操作的先後順序,也就是說有可能JVM會為新的Singleton實例分配空間,然後直接賦值給instance成員,然後再去初始化這個Singleton實例。這樣就可能出錯了,我們以A、B兩個線程為例:

a>A、B線程同時進入了第一個if判斷

b>A首先進入synchronized塊,由於instance為null,所以它執行instance = new Singleton();

c>由於JVM內部的優化機制,JVM先畫出了一些分配給Singleton實例的空白內存,並賦值給instance成員(注意此時JVM沒有開始初始化這個實例),然後A離開了synchronized塊。

d>B進入synchronized塊,由於instance此時不是null,因此它馬上離開了synchronized塊並將結果返回給調用該方法的程序。

e>此時B線程打算使用Singleton實例,卻發現它沒有被初始化,於是錯誤發生了。

所以程序還是有可能發生錯誤,其實程序在運行過程是很復雜的,從這點我們就可以看出,尤其是在寫多線程環境下的程序更有難度,有挑戰性。我們對該程序做進一步優化:
[java]view plain {=newSingleton();}(){returnSingletonFactory.instance;}
實際情況是,單例模式使用內部類來維護單例的實現,JVM內部的機制能夠保證當一個類被載入的時候,這個類的載入過程是線程互斥的。這樣當我們第一次調用getInstance的時候,JVM能夠幫我們保證instance只被創建一次,並且會保證把賦值給instance的內存初始化完畢,這樣我們就不用擔心上面的問題。同時該方法也只會在第一次調用的時候使用互斥機制,這樣就解決了低性能問題。這樣我們暫時總結一個完美的單例模式:
[java]view plain publicclassSingleton{/*私有構造方法,防止被實例化*/privateSingleton(){}/*此處使用一個內部類來維護單例*/{=newSingleton();}/*獲取實例*/(){returnSingletonFactory.instance;}/*如果該對象被用於序列化,可以保證對象在序列化前後保持一致*/publicObjectreadResolve(){returngetInstance();}}
其實說它完美,也不一定,如果在構造函數中拋出異常,實例將永遠得不到創建,也會出錯。所以說,十分完美的東西是沒有的,我們只能根據實際情況,選擇最適合自己應用場景的實現方法。也有人這樣實現:因為我們只需要在創建類的時候進行同步,所以只要將創建和getInstance()分開,單獨為創建加synchronized關鍵字,也是可以的:
[java]view plain publicclassSingletonTest{=null;privateSingletonTest(){}(){if(instance==null){instance=newSingletonTest();}}(){if(instance==null){syncInit();}returninstance;}}
考慮性能的話,整個程序只需創建一次實例,所以性能也不會有什麼影響。

補充:採用"影子實例"的辦法為單例對象的屬性同步更新
[java]view plain publicclassSingletonTest{=null;privateVectorproperties=null;publicVectorgetProperties(){returnproperties;}privateSingletonTest(){}(){if(instance==null){instance=newSingletonTest();}}(){if(instance==null){syncInit();}returninstance;}publicvoipdateProperties(){SingletonTestshadow=newSingletonTest();properties=shadow.getProperties();}}
通過單例模式的學習告訴我們:

1、單例模式理解起來簡單,但是具體實現起來還是有一定的難度。

2、synchronized關鍵字鎖定的是對象,在用的時候,一定要在恰當的地方使用(注意需要使用鎖的對象和過程,可能有的時候並不是整個對象及整個過程都需要鎖)。

到這兒,單例模式基本已經講完了,結尾處,筆者突然想到另一個問題,就是採用類的靜態方法,實現單例模式的效果,也是可行的,此處二者有什麼不同?

首先,靜態類不能實現介面。(從類的角度說是可以的,但是那樣就破壞了靜態了。因為介面中不允許有static修飾的方法,所以即使實現了也是非靜態的)

其次,單例可以被延遲初始化,靜態類一般在第一次載入是初始化。之所以延遲載入,是因為有些類比較龐大,所以延遲載入有助於提升性能。

再次,單例類可以被繼承,他的方法可以被覆寫。但是靜態類內部方法都是static,無法被覆寫。

最後一點,單例類比較靈活,畢竟從實現上只是一個普通的Java類,只要滿足單例的基本需求,你可以在裡面隨心所欲的實現一些其它功能,但是靜態類不行。從上面這些概括中,基本可以看出二者的區別,但是,從另一方面講,我們上面最後實現的那個單例模式,內部就是用一個靜態類來實現的,所以,二者有很大的關聯,只是我們考慮問題的層面不同罷了。兩種思想的結合,才能造就出完美的解決方案,就像HashMap採用數組+鏈表來實現一樣,其實生活中很多事情都是這樣,單用不同的方法來處理問題,總是有優點也有缺點,最完美的方法是,結合各個方法的優點,才能最好的解決問題!

4、建造者模式(Builder)

工廠類模式提供的是創建單個類的模式,而建造者模式則是將各種產品集中起來進行管理,用來創建復合對象,所謂復合對象就是指某個類具有不同的屬性,其實建造者模式就是前面抽象工廠模式和最後的Test結合起來得到的。我們看一下代碼:

還和前面一樣,一個Sender介面,兩個實現類MailSender和SmsSender。最後,建造者類如下: [java]view plain publicclassBuilder{privateList list=newArrayList ();publicvoidproceMailSender(intcount){for(inti=0;i0){pos--;}returncollection.get(pos);}@OverridepublicObjectnext(){if(pos

❸ JAVA 學習方法或捷徑--求教

JAVA同其它任何一門編程語言一樣,都是要從淺到深的過程,如果你想愉快的學習這門語言的話,給你看篇文章,記住JAVA學習要有耐心!下面的文章也許對你有幫助
1. Java語言基礎
談到Java語言基礎學習的書籍,大家肯定會推薦Bruce Eckel的《Thinking in Java》。它是一本寫的相當深刻的技術書籍,Java語言基礎部分基本沒有其它任何一本書可以超越它。該書的作者Bruce Eckel在網路上被稱為天才的投機者,作者的《Thinking in C++》在1995年曾獲SoftwareDevelopment Jolt Award最佳書籍大獎,《Thinking in Java》被評為1999年Java World「最愛讀者歡迎圖書」,並且贏得了編輯首選圖書獎。作者從1986年至今,已經發表了超過150篇計算機技術文章,出版了6本書(其中4本是關於C++的),並且在全世界做了數百次演講。他是《Thinking in Java》、《Thinking in C++》、《C++ Inside & Out》《Using C++》和《Thinking in Patterns》的作者,同時還是《Black Belt C++》文集的編輯。他的書被讀者稱為「最好的Java參考書……絕對讓人震驚」;「購買Java參考書最明智的選擇」;「我見過的最棒的編程指南」。作者的非凡才華,極其跨越語言的能力,使作者被選為Java發展10年間與Java關系最密切的10個人物之一。

《Thinking in Java》講述了Java語言的方方面面,很多Java語言的老手都評價「這是一本將Java語言講得相當醜陋的書」。該書談及了java語言的很多細節,每一個方面都是相當深刻的。通過本書你可以看到「醜陋的」java語言。

網路上關於java語言講解的視頻很多很多,其中不凡有垃圾。《翁愷—JAVA語言》可能是你學習java語言基礎的唯一選擇,該講座基本按照《Thinking in Java》這本書講解,其中不凡有翁老師的很多有意思的笑話。我很幸運學習就是從此視頻開始的。內容包括30講,我總共看了3遍。

不過,對於初學者我不太推薦使用《Thinking in Java》,我比較推薦Prentice Hall PTR 的《Core Java 2》國內稱為《Java 2 核心技術》,目前是第七版。網路上大家都可以下載到電子版。Oreilly的《Java in a nutshell》也是一個不錯的選擇。讀完以上兩本後,你可以看看翁愷老師的視頻,接著可以研究《Thinking in Java》了。

2. Java數據結構
市面上關於Java數據結構的書本身就很少很少。大致有APress 的《Java Collections》,Jones 和Bartlett 的《Data Structures in Java》、《Object-oriented Data Structures Using Java》以及Prentice Hall 出版的《Data Structures and Algorithms in Java》 (Dec 19, 2005)還有一本就是《Data Structures And Algorithms With Object-oriented Design Patterns In Java》。很幸運我的第一本英文書就是APress 的《Java Collections》(本書在國內可能根本就沒有中文版――只能下載英文版了),很不錯,講得很有條例、很簡單,是一本完完全全Java Collections API介紹的書籍,其中不凡有擴展API的例子。這是我推薦你學習java數據結構的唯一一本好書。其它的Jones 和Bartlett的那兩本國內好像有一本中文版,想看你也可以看看。

在學習完API後,你可以看看java.util包中對應的類了。不過只有在學習過設計模式後你才有可能完全理解整個Java Collections Framework。Java Collections Framework使用了很多著名的設計模式如:迭代器(Iterator)模式,工廠方法模式、裝飾器模式、適配器模式等等。通過研究java.util包中數據結構的源代碼,你可以知道臭名昭著的Properties類的設計了,同時可能基本具備設計簡單的數據結構的能力了。

所謂學習無止境,學習完Sun提供了Java Collections Framework後,你可以研究Apche的另一個Java Collections Framework,很有意思哦。互為補充的兩個Framework。

在大家學習、研究Java Collections之前,我提示一下Java Collections主要包括以下三部分:介面(Interface)、實現(Implemention)和演算法(Algorithm)。

1. 介面主要有List、Set、Queue和 Map。List 、Se t和Queue是 Collection介面的子介面。

2. 實現主要是實現這些介面的具體類。如實現List介面的ArrayList、LinkedList、Stack和Vector;實現Set介面的HashSet、TreeSet 和LinkedHashSet;實現Queue介面的PriorityQueue、SynchronousQueue等等;實現Map介面的HashMap、TreeMap、Hashtable、Properties、WeakHashMap等等。

3. 演算法主要是由Arrays類和Collections類提供的,它是整個Java Collection Framework演算法的核心。支持各種類型的排序,查找等常用操作。

Java Collections中包含兩個版本的數據結構,主要是原先的支持同步的數據結構和後來不支持同步的數據結構。

Java Collection Framework在使用Comparator和Comparable介面支持排序。同時提供新舊兩個版本的迭代器Iterator和Enumeraton,以及它們如何轉換等等。

在java.util包中的Obserable介面和Observer類是考察者模式的核心。

……

3. Java IO
市面上關於IO的書籍也僅僅只有Oreilly出版社的兩本,都是Elliotte Rusty Harold的著作。兩本書的風格基本一致,推薦閱讀是第一版的《Jvava I/O》,講得比較淺顯,內容相對比較集中,實例也很多。第二版今年5月國外才出版,很有幸我在網路上下載了第二版,講得極其詳細――726頁的大塊頭(我化了兩個星期),這次將NIO和IO和在一起,還包括J2ME部分的,不過串口、並口通信部分好像類庫支持不夠,自己不能實際操作。

與第一版的《Jvava I/O》一起的Oreilly還有一本《Jvava NIO》,也是很不錯的哦。

大家在依次閱讀完《Jvava I/O》以及《Jvava NIO》後,可以研究java.io包中的源代碼了。在大家研究源代碼前我給點提示:

Java的io包主要包括:

1. 兩種流:位元組流(byte Stream)和字元流(character stream),這兩種流不存在所謂的誰代替誰、誰比誰高級之說,它們互為補充,只是側重點不同而已。

2. 兩種對稱:1.位元組流、字元流的對稱;2.輸入、輸出的對稱。

3. 一個橋梁:將位元組流轉變為字元流的InputStreamReader和OutputStreamWriter。

其中必須注意:

1. PipedInputStream和PipedOutputStrem是兩個比較有趣的類。

2. 支持Buffered的流是我們經常使用的類。

3. 裝飾器(Decorator)模式在java最著名的應用就是用於io的設計。仔細研究各個Filter流與具體流的關系,多看設計模式的書籍。相信你會有所所獲。

4. 學習好io包,是研究net包,rmi包……的基礎哦!

4 . Java資料庫
資料庫的書籍太多太多了,也是太爛太爛了!這方面的書我基本都研究過,推薦的你就看看Apress的《JDBC Recipes A Problem Solution Approach 》很不錯,國外2005年底才出版,(國內好像沒有中文版,不過出了中文版也不一定值得看――國內經常將國外的書翻譯得一塌糊塗、不堪入目)不過我們真的很幸運,網路上有電子版的。值得一看。推薦我看的第一本比較滿意的――Wiley出版的《Java Database Bible》,講得很不錯!Sun公司自己的關於JDBC API介紹的那一本《JDBC API Tutorial andRefernece》也不錯。我第二本JDBC的就是研究的這套API。

不過目前這些書都是一些相對比較浮淺的API應用的書籍。有機會我會給大家帶來介紹JDBC API以及JDBC實現內部細節的書!我盡快努力,同時希望得到大家的支持!

順便給學習JDBC的朋友一點提示:

JDBC的學習和使用主要是這套API,其使用過程也是極其簡單,下面是使用JDBC的一般流程:

1. 載入某個資料庫的驅動(Driver類),通常使用Class.forName(「驅動的類名「);

2. 連接資料庫――

Connection con = DriverManager.getConnection(url,username,password);

3. 得到會話――Statement stmt = con.createStatement();

4. 執行操作――Result rs = stmt.executeQuery(「sql查詢語句」);

5. 處理結果――

while(rs.next()){

String col1 = rs.getString(1);

……

}

簡單吧!整個JDBC中可以變化的一般是:

1. 可以由Connection對象創建Statement、PreparedStatement和CallableStatement創建三種類型的Statement。

2. 可以創建多種類型的ResultSet:支持單向移動和個自由移動;可更新的和不可更新的;支持不同等級的交易的…..

3. 數據輸入的批處理。

4. 結果集中特殊類型(Blob、Clob、Arrary和Ref、Struct)列的操作。

5. 這些特殊類型的錄入資料庫。

6. javax.sql包中特殊結果集(CachedRowSet、JdbcRowSet、WebRowSet)的操作。

7. 其它的就是一個DataSource了,也很簡單!一個J2EE中的被管理對象

簡單吧!相信大家很快就會征服JDBC。

5. Java 網路編程
網路編程――一個神秘的、充滿挑戰的方向。不過在談Java網路編程之前首先感謝Sun公司的開發人員,因為它們天才的設想,充滿智慧的架構,使廣大java程序員學習java網路編程變得異常簡單。

Java網路編程方面的書,我推薦O'Reilly的《Java Network Programming》,目前已經第三版了,以前的版本市面上肯定有!網路上早有第三版的電子版,國外2004年出版,706頁哦!講得很全,比較深入,太深入的可能由於Sun有些東西沒有完全公開,所以也就不好講了,有興趣的可以下載看看!第二本還是O'Reilly 1998年出版的《Java distributed computing 》,基礎部分寫得比較詳細,後面的實例還是值得研究的。

在大家閱讀這些書之前,給大家一點提示:

java網路編程其實相對比較簡單,入門也很快很快。java網路編程主要包括兩個部分:1.Socket;2.URL部分。不過第二部分也完全建立在第一部分的基礎上。

1. Socket包括客戶端的Socket和伺服器端的ServerSocket。還有就是DatagramSocket和DatagramPacket,它對應於UDP通信協議。 總之,Socket部分是建立其它高級協議的基礎。

2. URL類是一個網路資源定位器,通常和具體的網路協議如HTTP,FTP,Telnet……相關。通過該類可以連接網路上的資源,通過其openStream可以以io包中的流(InputStream)的形式讀取網路資源;通過其OpenConnection方法,可以打開一個連接,在此連接上可以不僅可以完成讀的操作,還可以完成寫的操作。

Java的網路編程大體包括以上兩部分。網路編程和IO以及多線程部分非常密切,在學習此部分前大家一定對這兩部分了解比較透徹。

學習了以上部分你可以研究java.net包中的與此相關的源代碼了!研究所有的源代碼還為時尚早。在整個net包中包含:ContentHandlerFactory、URLStreamHandlerFactory、URLStreamHandler、URLClassLoader等輔助類,它們構成了java.net網路編程的框架,通過研究其源代碼,你不僅可以快速理解java.net包,還可以為以後擴展該包打下基礎,甚至可以將此思維方式運用到自己的項目中。

到此為止你對java.net包應該才了解60%,還有一部分你可以使用JDecompiler之類的反編譯軟體打開你JDK安裝目錄下\jdkxxx\jre\lib目錄中的rt.jar,用WinRAR之類的軟體打開它的sun.net包,反編譯所有的文件,它是URL類工作的細節。當研究完該sun.net包,你就會對整個網路編程很熟悉很熟悉了。

一切看起來我們已經對網路編程很精通了。其實不然,剛剛開始而已,要想深入,請繼續吧!網路上很多優秀的網路編程庫甚至軟體可以為我們「添加功力」。如Apache的HttpCore和HTTPConnection 是兩個和HTTP協議相關庫;JGroups是研究分布式通信、群組通信的必讀庫;接著我們可以研究P2P的軟體包,如Sun公司的JXTA,它可能是java平台點對點通信未來的標准哦!接著你可以研究成熟得不得了,使用極其廣泛得P2P軟體Azureus!www.sourceforge.net可以下載到!

千里之行始於足下!Just do it !(目前我也只研究了net包,其它的會在不久的將來繼續深入。Sun公司因為某些原因沒有公開net的其它實現細節,在其允許將其源代碼以文字的形式加以研究,以及允許將其沒有公開的實現寫入書中時,我很希望能出一本java網路編程的書籍,以飧廣大讀者!!)

6. Servlet和JSP
Servlet、JSP的書也是滿地都是!值得推薦的也僅僅兩三本。實推Addison Wiley的《Servlets and JavaServer pages :The J2EE Technology Web Tier》,又是一本很厚的哦!國外2003年出版、784頁,講得比較全,例子也很多,特別是第八章Filter,舉了幾個不錯的例子。其它所有我看到的關於Servlet和JSP的書都沒有如此深入的!(可能有我沒有看到而已)。O』reilly的《Java Servlet Programming》和《Java Server Pages》相對比較好懂一些,可以讀讀!

在大家學習Servlet和Jsp之前我還是要提醒一下:

本質上說Servlet就是一個實現Servlet介面的、部署於伺服器端的伺服器端的程序罷了!它可以象寫其它任何java應用程序一樣編寫,它可以操作資料庫、可以操作本地文件、可以連接本地EJB……編寫Servlet程序的一般流程為:

1. 繼承一個HttpServlet類;

2. 覆蓋其doGet、doPost方法;

3. 在覆蓋方法的內部操作方法參數HttpServletRequest和HttpServletResponse。

4. 讀取請求利用HttpServletRequest。利用HttpServletRequest你可以操作Http協議的協議頭、可以得到請求的操作方法、可以得到請求的路徑、可以得到請求的字元串、以及和請求客戶相關的信息,更主要的你可以得到Cookie和HttpSession這兩個對象。

5. 利用Cookie你可以操作「甜心」對象或者將其寫入HttpServletResponse中。

6. 向客戶輸出信息可以使用HttpServletResponse。使用HttpServletResponse可以寫入各種類型的協議頭、可以增加Cookie、可以重定向其它URL、可以向客戶發送Http協議的狀態碼。

7. 利用HttpSession在會話內完成你想實現的任何功能。

同時Servlet還提供了一些事件和事件監聽器(簡單的觀察者模式而已)。還有就是過濾器(Filter)和包裝器(ServletRequestWrapper、ServletResponseWrapper)――簡單的流的使用和裝飾器模式的使用。

學習Sevlet、JSP必然要部署到伺服器中,記住通常文件部署的步驟和參數的設置以及在程序中如何使用就可以了。

完全理解Servlet後,學習jsp相對比較容易了!Jsp完全建立在Servlet的基礎上,它是為了迎合那些喜歡在Html文檔中嵌入腳本(如:PHP之類的網頁編程語言)的程序員的需要罷了!學起來也相當的容易!

一切看起來似乎那麼的風平浪靜,簡單好學!簡單的表象背後有其復雜的機理。要想對Servlet和Jsp徹底研究,你得研究Tomcat等開源軟體的具體實現。它無非就是一個伺服器,在客戶利用網頁通過HTTP協議向伺服器發送請求後,伺服器將此HTTP請求轉化為相應的HttpServletRequest對象,調用你編寫的Servlet罷了,在你的Servlet中你肯定操作了此HttpServletRequest了吧,同時操作了HttpServletResponse了吧,伺服器就將此HttpServletResponse按照HTTP協議的要求利用HTTP協議發送給你的瀏覽器了!在伺服器端的Jsp網頁在被客戶請求後,Tomcat會利用編譯軟體,使用javax.servlet.jsp包中的模板,編譯此jsp文件,編譯後就是一個Servlet!以後的操作和Servlet完全一樣哦!

在Servlet和Jsp的基礎上出現了,所謂的高級技術:JSTL,Struts……無非就是一些標簽和MVC模式的使用。

繼續前進吧!勝利就在前方!!

7. 多線程
一個看起來很神秘,卻很容易上手、很難精通的方向!

我推薦兩本我感覺很好的書籍。首先是我第一本能上手看的這方面的書,Sams 1998年出版的《Java Thread Programming》,寫得暴好,很容易讀懂,我有空還時常看當時的筆記!要知道怎麼好你自己看吧!第二本OReilly三次出版的《Java Threads》,最新是2004版,國內好像有中文版,推薦你還是看英文版的吧!書中談到了與多線程相關的N個方向,如IO、Swing、Collection等等。

給大家一點提示吧!java類庫中與多線程相關的類不是很多,主要有:Thread、ThreadGroup以及ThreadLocal和InheritableThreadLocal四個類和一個Runnable介面;關鍵字synchronize、volatile ;以及Object對象的wait、notify、notifyAll方法!

1 Thread是多線程的核心類,提供了一系列創建和操作多線程的方法。

2 ThreadGroup是一個管理Thread的工具類。

3 ThreadLocal和InheritableThreadLocal為Thread提供了一個類似保險箱功能的存儲線程對象的類!

4 Runnable不用說了吧!

5 synchronize是同步方法和同步塊的核心哦!多個線程調用此方法時,只有一個線程可以使用此方法,其它方法阻塞,從而保證被操作對象內部狀態完整性。某個線程調用帶有synchronize的方法或塊時會得到該對象的對象鎖,完成塊中的操作後釋放此對象鎖,從而其它對象可以繼續操作。

6 wait、notify、notifyAll提供了有效的等待/通知機制。Java語言中每一個對象都有一個休息室,任何線程在其操作的對象的狀態不滿足的情況下,在該對象的休息室中休息,釋放對象鎖;當其它線程操作該對象後,喚醒休息室中的線程,它們再檢查條件,當條件滿足後,執行相應的操作。

多線程大致就這么多基礎的!簡單嗎!這對於一個真正的程序員應該是不夠的,真正對多線程要有所掌握,請您研究java.util.concurrent包吧!大師Doug Lea的作品,原先是一個開源的一致性編程的庫,後來被Sun公司並入java類庫。作者的網站上也有另外一個版本的該類庫!值得研究的好東西!Hibernation、OpenJMS等開源軟體都使用了此包!

8. 設計模式
談到設計模式很多人多會推薦GOF的那本,該書在Amzon上是五星級的推薦書籍。不過對於學習java沒多久的、特別是java初學者,我很不推薦這本書。主要是該書的例子基本都是C++的,很多細節沒有講述得足夠清楚。

我給大家推薦的第一本是閻宏博士的《Java 與模式》,它是第一本中國人自己寫的關於設計模式的書籍,寫的比較有趣,融合了很多中華民族的文化和觀念,例子、類圖都比較多,且相對簡單!非常不錯的入門書籍――又是大塊頭哦!

其次我推薦Wiley出版社出版的《Pattern In Java》一套三本,我才看了第一本,好像第二本不怎麼樣,第三本還不錯!

第三本是中文翻譯版的關於多線程模式的(很難得的中文翻譯版)中國鐵道出版社2003年出版的《Java多線程設計模式》,將多線程模式講得非常淺顯,配有大量的圖例,每章都有習題,最後有答案!我研究多線程模式就是由它開始的!

第四本,今年出版的Head First系列的《Head First Design Pattern》,秉承Head First系列圖書的優點,大量的類圖、豐富的實例、有趣的註解,值得購買!

其次在J2EE方向你可以研究閱讀Addison Wesley 2002年出版的《Patterns of Enterprise Application Architecture》,眾多大腕的作品,講企業消息集成的!Sun提供的《J2EE PATTERNS SL500》也很好!晚了推薦那一本Amzon 4星半的《Holub on patterns》,大師的作品,提供了,很值得研究的例子,不過對上面四本不是很熟悉的讀者,最好不要讀它!可能會讓你比較累!

我學習設計模式經過一段很曲折的路線,前前後後大約看了20本,閻宏博士的《Java 與模式》我看了4遍,還排除我第一次基本沒看懂的看!記得研一時老師給我們講了GOF的那本,作為選修課,我和它們計算機系的碩士、博士們一起,到最後一個班40-50個人,不超過3個人明白,我也沒有明白任何一點(基礎差吧――主要我對C++語言一點都不了解),憑我不伏輸的性格,我認為我對java語言理解還可以,我就借了《Java 與模式》,結果還是基本沒看懂。很有幸的是讀研三時,聽過了上交大饒若楠老師關於Java OOP語言的講座,我懂了組合書籍模式等三種設計模式後,對其它模式有了強烈的興趣和要征服它的願望!工作後我買的第一本就是《Java 與模式》,第一遍花了2個月研究了這個1000多頁的大塊頭,後來第三遍15天左右就可以搞定,筆記記了一大本!從此一發不可收拾。

選對書、埋頭研究。相信很快就會入門的!

學習Java語言8個簡單的部分,這只是我們研究Java語言的開始!這些都懂了充其量一個java程序員而已,後面的路很長很長!我們可以繼續研究資料庫實現的源代碼、Servlet伺服器的源代碼、RMI、EJB、JNDI、面向方面編程、重構、ANT工具、Eclipse工具、Spring工具、JBoss、JOnAS、Apache Geronimo等J2EE伺服器!研究了這些你可能會成為一個出色的J2EE Architecture!你可以繼續研究剖析器、編譯器、JNODE(java寫的操作系統)……

感謝大家有此耐心,聽我羅羅嗦嗦大半天!感謝大家的閱讀,感謝群里的朋友!這篇文章主要應群里朋友的呼聲――不知道如何選書、不知道從何看起!大半天的功夫完成趕此文章,字句上難免有失誤,同時由於能力有限不凡有錯誤!請閱讀後批評指正!

上面基本是我研究java語言的順序,以上書籍都是我閱讀過的,不存在替任何出版社宣傳的成分!有的方法可能不適合你,假如你能收獲一點,兩點甚至更多,請你不要吝嗇推薦給你的朋友――共同學習!

感謝大家的閱讀;感謝互聯網的設計者;感謝java的設計師;感謝www.open-open.com和www.sourceforge.net網站!

熱點內容
勞斯來斯最高配置什麼價 發布:2025-02-06 04:41:13 瀏覽:235
軟體文件夾安裝包 發布:2025-02-06 04:38:53 瀏覽:942
h6二代有哪些隱藏配置 發布:2025-02-06 04:11:09 瀏覽:606
c語言中的void是什麼意思 發布:2025-02-06 04:05:26 瀏覽:233
加密狗是啥 發布:2025-02-06 03:48:03 瀏覽:556
phpcopy文件 發布:2025-02-06 03:41:26 瀏覽:412
系統配置頁面怎麼設置 發布:2025-02-06 03:36:34 瀏覽:699
家庭電腦搭建流媒體伺服器 發布:2025-02-06 03:19:02 瀏覽:346
matlab稀疏矩陣存儲 發布:2025-02-06 03:07:54 瀏覽:840
國際服2b2t伺服器地址 發布:2025-02-06 03:06:28 瀏覽:392