<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JavaExplore

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

    2006年8月24日

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

    posted @ 2006-09-12 23:36 JavaExplore 閱讀(6546) | 評論 (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 閱讀(378) | 評論 (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 閱讀(9948) | 評論 (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)蘊與外蘊狀態(tài),即不變的私有屬性與變化的私有屬性。建造工廠使用備忘錄模式存儲已經(jīng)建造的對象,建造對象的時候,以參數(shù)的形式傳遞享元對象的內(nèi)蘊屬性。實際調(diào)用中,使用傳遞外部參數(shù)的方法使用外蘊變量。

    ?? 復(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 閱讀(728) | 評論 (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 閱讀(4901) | 評論 (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 閱讀(2114) | 評論 (6)編輯 收藏

    主站蜘蛛池模板: 亚洲熟妇丰满多毛XXXX| 91青青青国产在观免费影视| 好男人视频社区精品免费| 亚洲最大的视频网站| 亚洲成人免费电影| 久久青青草原亚洲av无码app| 18禁在线无遮挡免费观看网站| 亚洲国产高清精品线久久| 免费播放国产性色生活片| 亚洲国产精品综合久久网络 | 亚洲M码 欧洲S码SSS222| 色婷婷精品免费视频| 国产亚洲精品无码专区| 成人久久免费网站| 337p日本欧洲亚洲大胆色噜噜 | 日韩精品无码免费专区午夜不卡| 亚洲综合伊人久久大杳蕉| 日韩av无码免费播放| 亚洲色图.com| 精品久久久久久久免费人妻| 精品无码专区亚洲| 中文字幕亚洲不卡在线亚瑟| 国产精品免费大片| 亚洲人成人77777网站不卡| 国产一区二区三区在线观看免费| 亚洲视频在线免费| 亚洲黄色免费观看| 国产高清在线免费视频| 国产精品免费视频观看拍拍| 亚洲国产一区二区三区青草影视 | 免费国产污网站在线观看不要卡| 亚洲永久精品ww47| 中文字幕影片免费在线观看| 国产天堂亚洲国产碰碰| 亚洲精品视频免费观看| 91福利免费体验区观看区| 亚洲一卡二卡三卡四卡无卡麻豆 | 亚洲国产综合人成综合网站| 久久99精品免费视频| 国产精品亚洲午夜一区二区三区| 亚洲成人一区二区|