JavaExplore

          一切像霧像雨又像風(fēng)
          posts - 19, comments - 45, trackbacks - 0, articles - 0

          2005年9月6日

               摘要: 3 數(shù)據(jù)源處理 JFreeChart 中的數(shù)據(jù)源是DataSet接口類型。該接口有三個主要的子類接口:CategoryDataset、PieDataset、SeriesDataset CategoryDataset 接口的實現(xiàn)類基本上都維護(hù)了一...  閱讀全文

          posted @ 2006-09-12 23:36 JavaExplore 閱讀(6551) | 評論 (15)編輯 收藏

          1、策略:常用于算法族,將算法從依賴的環(huán)境中抽象出來形成
          2、狀態(tài):和策略非常接近,使用于有明顯狀態(tài)變化的時候
          3、命令:命令的發(fā)起與執(zhí)行解藕,命令類可以獨立演化,有助于做redo undo操作以及記錄所執(zhí)行的命令
          4、解釋:用于文法的解析
          5、迭代子:java中有現(xiàn)成的實現(xiàn),iterator
          6、觀察者:常見,類似與模型視圖的關(guān)系,java中提供了oberver類和observable接口
          7、調(diào)停者:處理混亂的類交互,抽象出中間類,將類間的交互都通過這個類完成
          8、模版:將擁有同一父類的多個具體子類的共同操作提取出來形成抽象模版類
          ???????? 原則:具體的私有屬性應(yīng)該放到具體類中,抽象類中調(diào)用屬性通過屬性方法而不是直接調(diào)用屬性
          ?????????????? 將私有屬性放到具體的類中,才能方便對父類進(jìn)行多個實現(xiàn)。
          ???????? 將行為看作劃分類的標(biāo)準(zhǔn),以前我都是將數(shù)據(jù)模型看作劃分類的思想,以后應(yīng)該重新審視行為在類中的重要作用,特別是在的繼承等級中。

          posted @ 2006-09-12 23:33 JavaExplore 閱讀(381) | 評論 (0)編輯 收藏

          1 簡介

          JFreeChart SourceForge.net 上的一個開源項目,它的源碼和 API 都可以免費獲得。 JFreeChart 的功能非常強(qiáng)大,可以實現(xiàn)餅圖 ( 二維和三維 ) ,  柱狀圖  ( 水平 , 垂直 ), 線圖 , 點圖 , 時序圖 , 甘特圖 股票行情圖 , 混和圖 溫度計圖 刻度圖等常用商用圖表,   圖形可以導(dǎo)出成 PNG JPEG 格式,同時還可以與 PDF EXCEL 關(guān)聯(lián),支持對圖形的放大、縮小,支持常見圖形的 3D 顯示。

          2 圖形 對象的處理

          2 1 JFreeChart對象

          JFreeChart 可以生成很多圖形對象,它的工廠類提供了 33 個工廠方法用于生成不同的圖形對象(具體的工廠方法可以參見 JFreeChart API 手冊或者源碼中的 ChartFactory )。              JFreechart 對圖形對象的抽象具體化。圖形對象( JFreeChart ),由 Title( 主標(biāo)題 ) SubTitle (子標(biāo)題 ) Plot (圖形的繪制結(jié)構(gòu))等幾個主要對象組成。各個組成部分如下圖所示:

          這是一個 JFreeChart 對象,上面的“ chart 標(biāo)題”是 Title 對象,中間區(qū)域是 Plot 對象(包括繪圖區(qū)域和坐標(biāo)軸區(qū)域),下面的區(qū)域是 LegendTitle 對象,是一種 SubTitle 對象。

          每個 JFreeChart 對象只能有 1 Title 對象, 1 Plot 對象,可以有多個 SubTitle 對象。 JFreeChart 對象可以進(jìn)行的操作有:背景的設(shè)置(背景顏色、背景圖片、透明度等)、邊框的設(shè)置(是否可見、筆畫、 Paint 等)、渲染方式的設(shè)置、標(biāo)題對象的設(shè)置、子標(biāo)題對象的增刪查操作。(本文中的所有操作都不提供代碼級的介紹,可參見 API 手冊或者源碼)

          2 2 主標(biāo)題對象

          主標(biāo)題對象是 TextTitle 類型,可以進(jìn)行的操作有:背景設(shè)置、字體設(shè)置(字體類型、顏色、內(nèi)容、對齊方式等操作)、 tooltip 設(shè)置、 URL 設(shè)置。

          2 3 Plot 對象

          Plot 對象是圖形的繪制結(jié)構(gòu)對象。 JFreeChart 中含有很多不同的 Plot 對象,每一種圖形對象中的 Plot 對象都在實例化的時候創(chuàng)建。所有的 Plot 共有的操作有:背景設(shè)置(背景顏色、背景圖片、透明度等)、前景透明度設(shè)置、無數(shù)據(jù)存在情況的設(shè)置(顯示的字符內(nèi)容、顯示的字體、顯示的 Paint )、放大縮小比例的設(shè)置,大部分 Plot 對象還有設(shè)置 Datset 、設(shè)置 Renderer 對象操作。

          JFreeChart 中有 18 Plot 抽象類的具體實現(xiàn)類。 Plot 的具體實現(xiàn)類主要由以下重要對象組成: Renderer 對象(圖形的繪制單元——繪圖域) Datset (圖形的數(shù)據(jù)源), DomainAxis (區(qū)域軸,相當(dāng)于 x 軸), RangeAxis (范圍軸,相當(dāng)于 y 軸)。不同的 Plot 對象組成方式不盡相同,有的不含有 Renderer 對象,比如 CompassPlot ContourPlot MultiplePiePlot PiePlot 等,有的不含有 DomainAxis RangeAxis 對象,另外除了 FastScatterPlot 類都含有 Datset 對象, FastScatterPlot 使用 float 的二維數(shù)組充當(dāng)數(shù)據(jù)源。尤其說明一點,餅狀圖相關(guān)的 Plot 對象( MultiplePiePlot PiePlot PiePlot3D RingPlot )中都不含有 Renderer 對象、 DomainAxis 對象、 RangeAxis 對象。

          一般來說, Datset 對象存儲數(shù)據(jù)模型, Renderer 對象存儲顯示模型, Plot 對象根據(jù) Datset 對象、 Renderer 對象完成畫圖操作。

          仍以上面的圖形講解 Plot 對象的組成。

             上圖的中間區(qū)域是是一個 XYPlot 對象。其中的折線部分即是圖形的繪制單元 Renderer 對象。 X 軸是 DomainAxis y 軸是 RangeAxis ,其中 Datset 對象屬于數(shù)據(jù)模型范疇,是 UI 不可見對象。該圖中的 plot 背景色、網(wǎng)格線的各種設(shè)置可以通過 XYPlot 對象本身完成。

                 下面講解 Renderer 對象、 Axis 對象( X 軸、 y 軸都屬于 Axis 對象), Datset 對象在后續(xù)章節(jié)中專門講解。

          2 31 Renderer對象

          Renderer 對象是圖形的繪制單元。 JFreeChart 提供了兩個接口 CategoryItemRenderer XYItemRenderer 1 個抽象類 AbstractRenderer 供具體的 Renderer 類實現(xiàn),給出了將近 50 種具體實現(xiàn)類。

          一般來說 Renderer 對象可進(jìn)行的操作有:對 item label (下圖中的柱狀圖上的紅色數(shù)字即為 item label 的示例)的默認(rèn)設(shè)置( item label 的產(chǎn)生方式、是否可見、字體、 Paint 、正反向 item label 的位置設(shè)置等)、繪制圖形的邊框默認(rèn)設(shè)置( Paint 、筆畫、是否可見等)、繪制圖形的默認(rèn)設(shè)置(形狀、筆畫、是否可見、對應(yīng)的圖例中是否可見等,折線圖還有線條是否可見、折點圖形是否可見、折點圖形是否填充、折點圖形的形狀、對應(yīng)的圖例中線條是否可見、圖形是否可見、整體是否可見等)、以及對指定 item label 的設(shè)置、指定繪制圖形的設(shè)置。可以說和具體繪制的圖形相關(guān)的屬性都可以通過 Renderer 對象設(shè)置。

          不同的 Renderer 的實現(xiàn)類實現(xiàn)了不同的顯示方式,在含有 Renderer 對象的 JFreeChart 對象中, R enderer 對象決定了JFreeChart對象的顯示方式。例如:柱狀圖的Plot對象中默認(rèn)的Renderer對象是 CategoryItemRenderer 對象,通過設(shè)置 Plot 對象的Renderer對象 LineAndShapeRenderer ,則柱狀圖變?yōu)榫€圖。使用中一般不需要顯式的實例化一個 R enderer 對象,一般通過 JFreeChart 對象的 Plot 對象調(diào)用現(xiàn)有的 R enderer 對象進(jìn)行重新設(shè)置等操作。

          2 32 Axis對象

          JFreeChart 提供了兩種類型的坐標(biāo)軸: CategoryAxis (等級軸)和 ValueAxis (值軸), ValueAxis 又有 3 個子類: DateAxis (時間軸)、 NumberAxis (數(shù)字軸)、 PeriodAxis (時期軸)。這些坐標(biāo)軸還有更詳細(xì)的子類,不再一一列舉

          Axis 對象可進(jìn)行的操作有:標(biāo)題的設(shè)置(內(nèi)容、字體、Paint、顯示角度等)、坐標(biāo)線的設(shè)置(筆畫、Paint、是否可見等)、刻度線的設(shè)置(是否可見、筆畫、Paint、位于繪圖區(qū)域的長度、位于繪圖區(qū)域外的長度等)、刻度標(biāo)示的設(shè)置(筆畫、Paint、字體、與軸的距離等)、坐標(biāo)軸范圍設(shè)置等。

          CategoryAxis 對象還可以進(jìn)行的操作有: 刻度標(biāo)示間距 設(shè)置( 最小間距、最大間距、指定間距)等。

          ValueAxis 對象可進(jìn)行的操作有:軸端設(shè)置(顯示的圖形形狀)、范圍設(shè)置(是否自動產(chǎn)生范圍、自動產(chǎn)生的最小范圍、最大范圍、指定確定范圍、指定范圍大小等)、間隔設(shè)置(是否自動產(chǎn)生間隔、指定間隔)等。

          DateAxis 對象還有對時間刻度顯示格式的設(shè)置操作。

          2 4 子標(biāo)題對象

              子標(biāo)題對象是 Title 類型的對象,一個JFreeChart可以有多個子標(biāo)題對象。JFreeChart提供了5Title的實現(xiàn),可以是圖片、文本、圖例等的形式。

          (數(shù)據(jù)源以及常用圖形的處理以及進(jìn)一步的討論在后續(xù)文章中介紹)
           

          posted @ 2006-09-01 23:21 JavaExplore 閱讀(9950) | 評論 (1)編輯 收藏

          1、代理模式:參與角色:代理與真實實體共同的抽象角色、代理角色、真實實體角色
          ?????? 遠(yuǎn)程代理:封裝對與遠(yuǎn)程對象復(fù)雜的調(diào)用通訊過程,象調(diào)用本地對象一樣
          ?????? 虛擬代理:真實實體加載時間過長的,使用虛擬代理提供友好的顯示方式,一邊加載實際的對象
          ?????? 安全代理:調(diào)用真實的對象之前插入權(quán)限驗證模塊
          ?????? 智能引用代理:調(diào)用真實的對象之后調(diào)用統(tǒng)計等相關(guān)操作模塊

          2、享元模式:參與對象:建造工廠、抽象享元、具體享元
          ?????? 分析對象的內(nèi)蘊(yùn)與外蘊(yùn)狀態(tài),即不變的私有屬性與變化的私有屬性。建造工廠使用備忘錄模式存儲已經(jīng)建造的對象,建造對象的時候,以參數(shù)的形式傳遞享元對象的內(nèi)蘊(yùn)屬性。實際調(diào)用中,使用傳遞外部參數(shù)的方法使用外蘊(yùn)變量。

          ?? 復(fù)合的享元對象組成的對象,不可以整體使用享元模式,但可以單個的享元對象屬性使用該模式
          ?? 優(yōu)點:降低內(nèi)存中的對象? 缺點:設(shè)計復(fù)雜性
          ???????

          3、門面模式:結(jié)構(gòu)模式。為包含有很多對象的子系統(tǒng)提供統(tǒng)一的操作接口類,所有對該子系統(tǒng)的調(diào)用都通過這個類,降低子系統(tǒng)之間調(diào)用的復(fù)雜度,也符合笛比特法則(一個對象的朋友盡量少,只與朋友說話)

          4、橋梁模式:參與角色:抽象化角色、抽象化的具體角色、實現(xiàn)化角色、實現(xiàn)化的具體角色
          ?兩個有繼承等級的對象群,一個對象群對另一個對象群有調(diào)用關(guān)系的時候使用
          ??????? 目的:使抽象化與實現(xiàn)化解藕

          posted @ 2006-09-01 23:08 JavaExplore 閱讀(731) | 評論 (0)編輯 收藏

          ???????? 今天去jdon,看了它的設(shè)計研究欄目,bang有幾篇評論單例模式的文章,聲稱“Singleton is evil”(見http://www.jdon.com/jive/article.jsp?forum=91&thread=17578),并且引用幾篇外文頁面佐證自己的觀點,其中有一篇文章更是說,單例不僅不是一種模式,而是一種反模式。
          ??????? 下面我談?wù)勎覍卫J降目捶āV鹨环治鰡卫J降南葳澹瑤椭蠹艺_使用單例模式。
          (1)?陷阱一:調(diào)用函數(shù)的性能瓶頸
          ??????? 在c++中,單例只有一種實現(xiàn)方式——LazySingleton, 實現(xiàn)如下(本文全部使用java代碼):

          public ? class ?LazySingleton {
          ????
          private ? static ?LazySingleton?m_instance = null ;
          ???? private?LazySingleton(){};
          ?????synchronized?public?static?LazySingleton?getInstance(){
          ????????
          if(m_instance==null)
          ????????????m_instance
          =new?LazySingleton();
          ????????
          return?m_instance;
          ????}

          }

          LazySingleton將對象的初始化推遲到調(diào)用的時候。并且為了防止多線程環(huán)境下產(chǎn)生多個實例,使用synchronized關(guān)鍵字保證函數(shù)getInstance調(diào)用的線程安全。synchronized關(guān)鍵字的存在保證了只會產(chǎn)生一個對象,但也成了多線程環(huán)境下的性能瓶頸。一個多線程的程序,到了這里卻要排隊等候成了一個單線程式的執(zhí)行流程,這在高并發(fā)環(huán)境下是不可容忍的。而c++中可以使用雙重檢查機(jī)制將這種性能問題僅僅限制在第一次構(gòu)造對象的時候,而java中不可以使用雙重檢查機(jī)制。
          ????????但是java可以實現(xiàn)EagerSingleton,實現(xiàn)如下:

          public ? class ?EagerSingleton {
          ????
          private ? static ?EagerSingleton?m_instance = new ?EagerSingleton();
          ???? private?EagerSingleton(){};
          ???? public?static?agerSingleton?getInstance(){
          ????????
          return?m_instance;
          ????}

          }
          與LazySingleton相比,EagerSingleton將對象的初始化放到了類加載的時候。這樣就避免了synchronized關(guān)鍵字的性能瓶頸。
          (2)陷阱二:訪問互斥共享資源
          ?????????EagerSingleton中訪問互斥資源也要考慮線程安全問題。下面看一個例子:
          public?class?EagerSingleton{
          ????
          private?static?EagerSingleton?m_instance=new?EagerSingleton();
          ????
          private?HashMap?map=new?HashMap();
          ???
          private?EagerSingleton(){};
          ???
          public?static?agerSingleton?getInstance(){
          ????????
          return?m_instance;
          ????}

          ???????
          public?void?refreshMap(Object key){
          ????????
          synchronized(map){
          ????????????
          if(!map.contains(key))
          ????????????????map.put(key,value);
          //value為此時的實時數(shù)據(jù)
          ????????}
          ?
          ????}

          }
          因為該類是單例,可能多線程并發(fā)訪問map,map非線程安全,需要加線程安全關(guān)鍵字,否則就掉入了訪問互斥資源的陷阱。
          (3)陷阱三:非法邏輯陷阱
          ??????? 這種情況一般是濫用單例模式造成的,下面考慮一種濫用單例的情況。下面的代碼的作用是getValueByName后,馬上printValue即完成操作流程。
          public?class?EagerSingleton{
          ????
          private?static?EagerSingleton?m_instance=new?EagerSingleton();
          ????
          private?String?value=null;
          ???
          private?EagerSingleton(){};
          ???
          public?static?agerSingleton?getInstance(){
          ????????
          return?m_instance;
          ????}

          ????
          synchronized?public?void?getValueByName(String?name){
          ????????value
          =getByNameFromDateBase(name);
          ????????
          ????}

          ????
          public?viod?printValue(){
          ????????System.out.println(
          this.vaue);
          ????}

          }

          該類含有一私有屬性value,在多線程環(huán)境下不能保證value值的合理邏輯,一線程getValueByName后,馬上printValue,也有可能value的值已經(jīng)被其他線程修改。這種情況就屬于單例模式的濫用,該類根本不適合做成單例。
          ??????? 消除非法邏輯的陷阱,可以通過將該類重構(gòu)為純粹的行為類完成。重構(gòu)后的代碼如下:

          public?class?EagerSingleton{
          ????
          private?static?EagerSingleton?m_instance=new?EagerSingleton();
          ???
          private?EagerSingleton(){};
          ???
          public?static?agerSingleton?getInstance(){
          ????????
          return?m_instance;
          ????}

          ????
          private?String?getValueByName(String?name){
          ????????
          return?getByNameFromDateBase(name);
          ????????
          ????}

          ????
          public?viod?printName(String?name){
          ????????String?value
          =getValueByName(String?name);
          ????????System.out.println(value);
          ????}

          }

          通過調(diào)用printName(String name)直接完成操作流程,將其中的私有屬性處理成過程式的參數(shù)傳遞,將該類修改成純粹的行為類。

          ??????? 含有私有屬性并且含有對它賦值操作的類并非都會調(diào)入該陷阱,構(gòu)造函數(shù)里進(jìn)行對私有屬性賦值不會引起非法邏輯,如下代碼

          public?class?EagerSingleton{
          ????
          private?static?EagerSingleton?m_instance=new?EagerSingleton();
          ????
          private?HashMap?map==new?HashMap();
          ????
          ??? private
          ?EagerSingleton(){
          ????????map.put(key,value);
          //value為此時的實時數(shù)據(jù)
          ????}

          ???
          public?static?agerSingleton?getInstance(){
          ????????
          return?m_instance;
          ????}

          }

          構(gòu)造函數(shù)里不必要加線程安全關(guān)鍵字也可以保證線程安全,因為類加載器是線程安全的,EagerSingleton只會在類加載的時候?qū)嵗淮危@樣不會出現(xiàn)單例模式的線程不安全,也不會造成非法邏輯。
          (4)陷阱四:單例陷阱的傳遞
          ??????? 當(dāng)含有對象作為單例類的私有屬性時,陷阱不僅會出現(xiàn)在該類本身,還會傳遞到私有對象所在的類中。看如下代碼:

          public?class?EagerSingleton{
          ????
          private?static?EagerSingleton?m_instance=new?EagerSingleton();
          ????
          private?NewClass?newClass=nll;
          ???
          private?EagerSingleton(){
          ????????newClass
          =new?NewClass();
          ????}
          ;
          ???
          public?static?agerSingleton?getInstance(){
          ????????
          return?m_instance;
          ????}

          ???
          public?viod?printName(String?name){
          ????????String?value
          =newClass.operationByNameAndReturnValue(String?name);
          ????????System.out.println(value);
          ????}

          }
          乍一看,代碼中除了構(gòu)造函數(shù)對私有屬性進(jìn)行了初始化操作,其他地方?jīng)]有對私有屬性的賦值,不會引起非法邏輯陷阱。其實這個賦值操作可能隱含在newClass.operationByNameAndReturnValue(String name)操作,只有保證了NewClass的operationByNameAndReturnValue操作不會對它的私有屬性賦值操作,才能保證真正的合理邏輯。同樣,只有保證NewClass的operationByNameAndReturnValue操作沒有掉入訪問互斥資源陷阱,才能真正保證EagerSingleton沒有掉入該陷阱。
          ??????? 消除該陷阱的方法:(1)類方法的名稱要合理,比如純粹的行為方法名:interprete,excute,operation之類的方法中就不該含有對私有屬性直接或者間接的賦值操作,每個方法的責(zé)任要明確。(2)單例類中盡量不要含有非單例類的實例作為私有屬性(容器類除外),一定要有類的實例作為私有屬性的時候,重新審視這個作為私有屬性的類,是不是也應(yīng)該設(shè)計成單例類;或者保證對它的初始化賦值限制在構(gòu)造函數(shù)內(nèi)。

          posted @ 2006-08-26 11:26 JavaExplore 閱讀(4902) | 評論 (13)編輯 收藏

          最近發(fā)現(xiàn)一本<java與模式>,正好再溫故一下當(dāng)年的專業(yè)課內(nèi)容,下面是這幾天記的筆記.(并不是系統(tǒng)的講解書中的內(nèi)容)
          一  綜述:
          1、不要使用接口定義常量
          2、自己少用標(biāo)志接口
          3、不要繼承具體類
          4、類層次的中間節(jié)點應(yīng)該是接口或者抽象類,葉子是具體類
          5、子類應(yīng)當(dāng)擴(kuò)展父類的責(zé)任,而不是覆寫父類的責(zé)任
          6、面向接口編程
          7、不要濫用繼承,組合優(yōu)先于繼承

          java中設(shè)計不當(dāng)?shù)念悾篶alendar:作為接口,含有與具體的歷法(羅馬歷法)相關(guān)的常量,不能擴(kuò)展到中國的陰歷歷法(不符合開閉原則)
                              properies類:濫用繼承,繼承至hashtable,應(yīng)當(dāng)使用聚合

          8、笛比特法則:只與自己的直接朋友通信,不與陌生人通信(1)狹義笛比特法則:只與朋友通訊,通過自己的朋友傳遞間接的調(diào)用(2)結(jié)合依賴倒轉(zhuǎn)原則修改:不必通過朋友傳遞間接的調(diào)用,通過陌生人的抽象接口調(diào)用陌生人的行為(依舊不能與具體的陌生人發(fā)生通信)
          9、盡量降低類中成員的訪問權(quán)限,不要設(shè)計退化類(類似c中struct)。
                  java中的point2D以及Dinmension2D類有這種設(shè)計缺陷(不過這種情況問題不大)
          10、如果多個具體的產(chǎn)品類沒有共同的商業(yè)邏輯,就可以把它們抽象到一個接口中,如果有共同的商業(yè)邏輯,就把共同的部分抽象到抽象類中,共同的部分盡量向類繼承層次的上層移動,以達(dá)到復(fù)用的目的
          二   工廠模式
          1、簡單工廠模式:參與角色:工廠/抽象產(chǎn)品類/具體產(chǎn)品類

             缺點:添加新產(chǎn)品的時候,雖然產(chǎn)品相關(guān)代碼符合開閉原則,但對工廠類本身并不符合,需要修改其中的產(chǎn)生產(chǎn)品方法或者添加新的產(chǎn)生方法(工廠里實現(xiàn)的不同造成的修改不同)來支持新的產(chǎn)品類
             退化方式:省略掉工廠角色,抽象產(chǎn)品類擔(dān)任具體產(chǎn)品類的工廠角色:提供靜態(tài)的getInstance方法,比如java類庫中的DateFormat類,(本人認(rèn)為這樣很不符合開閉原則,父類中出現(xiàn)與具體子類相關(guān)的代碼,不方便擴(kuò)展,添加新產(chǎn)品的時候,修改的時候缺點與原簡單工廠的工廠角色類似)

          2、工廠方法模式:參與角色:抽象工廠類/具體工廠類/抽象產(chǎn)品類/具體產(chǎn)品類
               消除了簡單工廠的缺點


          3、抽象工廠模式:簡單工廠模式與工廠方法模式的結(jié)合

          4、單例模式:餓漢和懶漢兩種,前者將本身對象作為靜態(tài)私有屬性事先生成,后者推遲到調(diào)用的時候,后者需要考慮多線程的時候,前面需要加線程安全關(guān)鍵字(注意),java中還是前者為優(yōu)。
             不要濫用單例,只有系統(tǒng)要求只有一個類的實例的時候才調(diào)用
             有的單例可能有狀態(tài)屬性,這就為多例模式提供了可能
             含有私有屬性的類作成單例的時候尤其要注意:一是私有屬性的線程安全,確實需要的時候可以加線程安全關(guān)鍵字,比如系統(tǒng)中的log類,二是確認(rèn)這些屬性是不是可以所有線程共享的,類似普通類的static
          三   各種具體模式(1)
          1、建造模式:參與角色4個:指導(dǎo)者、抽象建造對象、具體建造對象、產(chǎn)品
                一個復(fù)雜的產(chǎn)品有很多的零部件,就可以使用具體的建造對象來一一構(gòu)造
          2、原始模式:深拷貝、淺拷貝
          3、適配器模式:將adaptee類適配成目標(biāo)接口
          4、合成模式:參與角色:composite接口、樹枝節(jié)點類、樹葉節(jié)點類
                分成透明式和安全式兩種,各有優(yōu)缺點
                (1)前者將管理子對象的方法放到接口中,這樣樹型結(jié)構(gòu)中的所有對象都是透明的,都可以統(tǒng)一調(diào)用,但是葉節(jié)點并沒有管理子對象的能力,因此透明但不安全
                (2)后者將管理子對象的方法下放到樹枝節(jié)點類中,這樣安全但不透明
          5、裝飾模式:繼承已有類的接口,提供和已有類相同的方法,并對已有類的功能提供擴(kuò)展(通過組合已有對象,調(diào)用已有對象方法的時候加入新的代碼)
                (1)透明的裝飾模式(純粹的裝飾模式):裝飾類、被裝飾類繼承于同一接口,而且裝飾類只實現(xiàn)接口的方法,不提供額外方法的實現(xiàn),調(diào)用該類的時候使用接口聲明調(diào)用(實例化當(dāng)然還是自己的構(gòu)造函數(shù)),即該類的所有方法都是透明的
                (2)半透明的裝飾模式(退化的裝飾模式):裝飾類、被裝飾類繼承于同一接口,裝飾類不僅實現(xiàn)接口的方法,還提供額外方法的實現(xiàn),這樣要調(diào)用它獨特的方法的時候就必須使用它本身來調(diào)用,退化到一半裝飾模式、一半適配器模式。

          posted @ 2006-08-24 21:25 JavaExplore 閱讀(2116) | 評論 (6)編輯 收藏

          花了很長時間,終于在Jboss部署成功了第一個EJB。
          Eclipse:3.1
          EJB:2.0
          JBoss:4.0.2
          關(guān)于如何部署EJB,網(wǎng)上有不少詳細(xì)介紹的文章。在這里我不在重復(fù)ejb的細(xì)枝末節(jié)。大體說一下,一個簡單的EJB包括:一個繼承SessionBean的類、一個繼承EJBObject接口的Remote接口、一個繼承EJBHome的Home接口、調(diào)用該EJB的一個類(網(wǎng)上的教程一般起名為XXXClient)。
          組織好這些類的目錄結(jié)構(gòu),寫好ejb-jar.xml,基本上就完成了。
          說明幾點:
          1、編譯類的時候,引入jboss-j2ee.jar與jbossall-client.jar包;
          2、ejb-jar.xml的DOCTYPE處一定要如此(針對EJB2.0,我部署的時候時間都浪費在這兒了):
          <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "3、繼承SessionBean的那個類至少要有一個ejbCreate()方法;
          4、應(yīng)該拋出的異常一定不能漏掉,特別是那兩個接口里面的方法應(yīng)該拋出的異常(都應(yīng)該有java.rmi.RemoteException);
          5、部署后以dos方式重啟jboss,若部署失敗,可以在dos窗口中看到出錯的原因。

          posted @ 2005-09-20 21:29 JavaExplore 閱讀(1318) | 評論 (0)編輯 收藏

          代碼中經(jīng)常會出現(xiàn)枚舉性的變量,比如血型、性別之類。
          以血型為例:

          class?Blood {
          public?final?static?
          int ?o = 0 ;
          public?final?static?
          int ?A = 1 ;
          public?final?static?
          int ?B = 2 ;
          public?final?static?
          int ?AB = 3 ;

          private?Blood();
          }



          class?person
          {
          private?
          int ?_blood;
          public?
          void ?setBlood( int ?b) {
          ???_blood
          = b;
          }

          如果要給一個person的實例設(shè)置血型,代碼如此:person.setBlood(Blood.A);
          這個寫法的代碼中,setBlood的參數(shù)為整型,如果如此調(diào)用person.setBlood(9);
          編譯器無法發(fā)現(xiàn)錯誤,只能靠人為控制,如果在方法setBlood中檢測參數(shù)的有效性,又超越了該方法的職責(zé)。

          重構(gòu)后的代碼如下:

          final class?Blood{
          public?final?static?Blood?O
          =new?Blood(0);
          public?final?static?Blood?A
          =new?Blood(1);
          public?final?static?Blood?B
          =new?Blood(2);
          public?final?static?Blood?AB
          =new?Blood(3);
          private?
          int?_bloodCode;
          private?Blood(
          int?b){
          ????_bloodCode
          =b;
          ??}

          public?
          int?getCode(){
          ????
          return?_bloodCode;
          ??}

          }


          class?person
          {
          private?Blood?_blood;
          public?setBlood(Blood?b)
          {
          ????_blood
          =b;
          ??}

          }

          如此,(1)隱藏了血型的編碼細(xì)節(jié)
          ????????????(2)方便編譯期間發(fā)現(xiàn)錯誤
          ??????????? (3)避免使用超越數(shù)據(jù)范圍的參數(shù)

          posted @ 2005-09-17 21:24 JavaExplore 閱讀(1470) | 評論 (7)編輯 收藏

          1、變量、對象聲明語法<%!.....%>
          2、嵌入java語句語法<%......%>
          3、調(diào)用javabean語法<jsp:useBean id="zong" scope="page" class="test.Hello"/>
               文件Hello.class位于目錄web-inf\classes\test下,該jsp頁面與文件夾web-inf位于同一目錄下。
          4、調(diào)用javabean的屬性語法<jsp:getProperty id="zong" property="A"/>
             類Hello中要有方法getA();
          5、javabean 的一般語法,構(gòu)造函數(shù)為public,所有屬性為private,每個屬性對應(yīng)get,set方法,boolean類型屬性的對應(yīng)get方法可以用is替換。

          posted @ 2005-09-17 20:47 JavaExplore 閱讀(1892) | 評論 (3)編輯 收藏

          這是我以前在http://bbs.chinajavaworld.com上發(fā)的一個帖子

          初來論壇,見大家一些基礎(chǔ)問題反復(fù)的問,很是浪費時間與精力,下面將常見問題逐一解答,并歡迎各位同道跟帖寫出常見問題以及解答方法。
          (1)、何處下載jdk?網(wǎng)址:java.sun.com/downloads
          何處下載tomcat?網(wǎng)址:http://jakarta.apache.org/site/binindex.cgi這個頁面很長,往下拉找到tomcat,有很多版本,現(xiàn)在最新的是 5.5.5-alpha exe PGP MD5
          (2)、為何安裝tomcat的時候停在using jvm?關(guān)掉瑞星,然后打開 控制面板-》管理工具-》服務(wù),找到瑞星對應(yīng)的全部服務(wù)都停止。然后重新安裝即可成功。
          (3)、安裝后需要如何配置環(huán)境變量?右鍵單擊"我的電腦",在彈出菜單中選擇"屬性"→"系統(tǒng)特性" →"高級" →"環(huán)境變量", 彈出環(huán)境變量對話框,就可以編輯系統(tǒng)的環(huán)境變量了。添加PATH、JAVA_HOME、CLASSPATH、TOMCAT_HOME四個變量。PATH=你的jdk目錄\bin;JAVA_HOME=你的jdk安裝目錄;CLASSPATH=你的jdk安裝目錄\lib\tools.jar;TOMCAT_HOME=你的tomcat安裝目錄。開啟tomcat服務(wù),然后使用:http://localhost:8080/就可以測試是不是配置成功。
          (4)、tomcat的目錄結(jié)構(gòu)是什么樣子的?下面說一下我們會經(jīng)常接觸到的目錄與文件。bin目錄下的tomcat5.exe是tomcat服務(wù)的啟動文件;logs目錄是一些日志文件,其中stdout.log是你的System.out.println打印的目的地(當(dāng)你打開tomcat服務(wù)地dos界面時,向該dos界面打印);webapps目錄是我們的網(wǎng)站文件放置的地方,webapps\ROOT是tomcat的默認(rèn)主頁目錄,可以使用http://localhost:8080來訪問該目錄。webapps下其他目錄下的文件,我們可以使用http://localhost:8080/目錄名來訪問。
          (5)、為何我得jsp不能正確顯示中文?這個不是配置的問題,大家都知道我們可以在html文件里通過設(shè)置<meta http-equiv="Content-Type" content="text/html; charset=gb2312">讓html顯示中文,jsp也是一樣,你設(shè)置<%@page contentType="text/html; charset=gb2312" %>就可以顯示中文。
          (6)、如何新建虛擬目錄?
          修改 Tomcat安裝目錄\conf\server.xml ,在下列行前
          </Host>
          </Engine>
          添加下列行:
          <Context path="/my" docBase="c:\myjsp\test" debug="0" reloadable="true">
          </Context>
          表示增加虛擬目錄 my,對應(yīng)物理目錄位置c:\myjsp\test,若存在c:\myjsp\test\hello.jsp,則下列地址可訪問:
          htpp://localhost:8080/my/hello.jsp
          修改server.xml后,需要重新啟動tomcat. (轉(zhuǎn)mouseLee回帖,測試正確)
          (7)、如何配置servlet?
          以(6)建立的虛擬目錄為例。假如你有一個servlet:MyFirstServlet。該servlet第一行代碼為:package com.myservlet;
          將MyFirstServlet.class復(fù)制到c:\myjsp\test\WEB-INF\classes\com\myservlet下面,無目錄的自己新建。然后打開c:\myjsp\test\WEB-INF\web.xml(該文件可以從tomcat的安裝目錄\webapps\ROOT\WEB-INF下面復(fù)制),在<!-- JSPC servlet mappings end -->前面加入<servlet>
          <servlet-name>newServlet</servlet-name>
          <servlet-class>com.myservlet.MyFirstServlet</servlet-class>
          </servlet>

          <servlet-mapping>
          <servlet-name>newServlet</servlet-name>
          <url-pattern>/ceshi</url-pattern>
          </servlet-mapping>
          然后你就可以通過htpp://localhost:8080/my/ceshi來訪問你的servlet了。

          posted @ 2005-09-17 20:14 JavaExplore 閱讀(1220) | 評論 (0)編輯 收藏

          java 開始版本的IO有兩個基本的面向byte類:InputStream、OutputStream
          為了擴(kuò)展輸入輸出的功能并且避免類的爆炸性增長,java語言使用修飾模式擴(kuò)展這兩個類的功能。
          常用的類有:DataInputStream、BufferedInputStream、FileInputStream、StringBufferInputString
                      DataOutputStream、BufferedOutputStream、FileOutputStream、PrintStream
               StringBufferInputString主要用于讀去內(nèi)存中的字符串
               FileInputStream主要用于讀取文件
               BufferedInputStream用于修飾上兩中InputStream
          如果要讀取文件并且要原樣復(fù)原文件,要用DataInputStream/DataOutputStream用字節(jié)讀寫

          java 后來的版本加入了很多面向Unicode的類:Reader、Writer
          仍舊使用模式擴(kuò)展這兩個類的功能。
          常用的類有:FileReader、StringReader、BufferedReader
                      FileWriter、StringWriter、PrintWriter、BufferedWriter

          一般使用中都是多個類同時使用的,一般都使用緩存類用以提高io性能
          比如(1)讀文件,根據(jù)文件名先生成FileInputStream,在用BufferedInputStream、DataInputStream修飾
          (2)讀取內(nèi)存中的文件,先生成StringBufferInputString,在用BufferedInputStream、DataInputStream修飾
          (3)寫文件,根據(jù)文件名生成FileWriter,再用BufferedWriter、PrintWriter修飾

          posted @ 2005-09-06 21:06 JavaExplore 閱讀(700) | 評論 (0)編輯 收藏

          以前寫程序沒有處理異常的習(xí)慣。即便是一個大的系統(tǒng),除了少數(shù)情況(比如發(fā)送郵件方法)之外,基本上看不見捕捉異常的代碼。現(xiàn)在學(xué)習(xí)java,保留了這個壞習(xí)慣。今天學(xué)習(xí)使用類FileInputStream和FileOutputStream,eclipse總是提示“Unhandled exception type FileNotFoundException”,浪費了很多時間找不到問題所在,后來發(fā)現(xiàn)是因為這兩個類的構(gòu)造函數(shù)定義中有“throws FileNotFoundException”,而我的程序中沒有捕捉也沒有繼續(xù)向外拋出異常。

          posted @ 2005-09-06 16:41 JavaExplore 閱讀(1144) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 波密县| 酉阳| 牡丹江市| 贡觉县| 宣恩县| 青田县| 岳阳县| 涪陵区| 新竹县| 历史| 湘西| 定结县| 赤壁市| 边坝县| 宝丰县| 河西区| 车致| 商城县| 房产| 寻乌县| 澳门| 百色市| 宝兴县| 普定县| 霍山县| 阳泉市| 兴宁市| 南华县| 吉水县| 南充市| 青龙| 瓦房店市| 威远县| 贵定县| 芒康县| 渭源县| 昌吉市| 科技| 麻栗坡县| 巩义市| 德化县|