第四十五講 I O流 初次認識裝飾設計模式

2021-09-02 01:40:38 字數 3437 閱讀 5304

現在有以下需求:要實現自己的一套io系統,實現檔案的讀取。沒必要百分百的跟jdk的功能一模一樣。

首先,mywriter類專門用於寫出資料,為什麼會有這個類呢?因為資料型別有很多,比如文字mytextwriter,**mymediawriter,等等。就會向上提取公共方法類即mywriter,可以有如下繼承關係:

mywriter//專門用於寫出資料的類|--

-mytextwriter

|---mymediawriter

|---。。。。。。//擴充套件的繼續繼承新增

但是又考慮到效率問題,要使用緩衝來提高效率。對寫方法複寫,那麼又有如下繼承關係。

mywriter//專門用於寫出資料的類|--

-mytextwriter

|---mybufferedtextwriter

|---mymediawriter

|---mybufferedmediawriter

上述的體系還是是可以的。但是,這個mywriter以後可能還會因為新的音訊檔案而必須新增加,那麼就又有如下的繼承關係圖。

mywriter//專門用於寫出資料的類|--

-mytextwriter

|---mybufferedtextwriter

|---mymediawriter

|---mybufferedmediawriter

|---myaudiowriter

|---mybufferedaudiowriter

|---。。。。。。//擴充套件的繼續繼承新增

問題也就隨之而來了,如果再多乙個子類,又得增加乙個緩衝的實現子類。雖然這個體系是可以使用的,但是擴充套件性不好,體系非常臃腫複雜。那麼就要對現有的體系進行優化。所有的緩衝子類使用的技術都是相同的,沒必要都給定義乙個子類。現在可以直接單獨定義乙個緩衝類,如下:

/**

* 專門為別人提高效率而存在的,所以,此類在初始化的時候,把被提高效率的物件傳進來。

*/class

mybufferedwriter

mybufferedwriter

(mymediawriter media)

}

你可以這樣理解:以前是有乙個資料型別的類,就弄乙個這個類的子類,弄個緩衝區來提高效率,來乙個弄乙個;現在是定義乙個緩衝區,大家公用乙個緩衝區,需要提高誰的效率,把誰傳進來,這樣公共方法就可以得到復用,如上**所示。

但是,上面的類的實現,擴充套件性很差。只要新增了新資料型別,那麼就得新添建構函式,所以還得繼續優化。找到所有建構函式的引數的共同型別,通過多型的形式,可以提高擴充套件性。

/**

* 通過多型的形式可以提高擴充套件性。

* 現在傳入的引數就可以是mytextwriter、mymediawriter、...

* 後期再出現新的子類,也可以接受

*/class

mybufferedwriter

extends

mywriter

}

為什麼要繼承mywriter類呢?新定義的類的作用,就是帶著緩衝技術的writer,裡面定義的也是寫出行為,只是功能更強的寫出行為。對寫行為進行了增強,那麼也是可以向上提公升,也有寫的動作,那麼也是寫的乙份子,實現寫的介面繼承mywriter也是ok的。

最後,上述的繼承體系,就變成了如**系,新體系的名字就叫作裝飾者模式

mywriter//專門用於寫出資料的類|--

-mytextwriter

|---mymediawriter

|---myaudiowriter

|---mybufferedwriter

當想要對已有的物件進行功能增強時,可以定義類,將已有物件傳入,基於已有的功能,並提供加強功能,那麼自定義的該類稱為裝飾類。裝飾類通常會通過構造方法接收被裝飾的物件,並基於被裝飾的物件的功能,提供更強的功能。

裝飾設計模式比繼承要靈活,避免了繼承體系臃腫;而且降低了類於類之間的關係(繼承體系的時候,緩衝類必須繼承相應的類。現在就不需要啦,沒有直接關係了)。

裝飾類因為增強已有物件,具備的功能和已有的是相同的,只不過提供了更強功能,所以裝飾類和被裝飾類通常都是屬於同乙個體系中的(可以理解為實現共同的介面,或繼承一樣父類)。結構上來說,由原來的繼承結構,變成了現在的組合結構(我裡面有你的結構)。

繼承不要寫的過多,不要以繼承為主。產生子類過多,體系會顯得非常臃腫。假設現在有個物件,是一年前寫的,現在你新來到公司,覺得他這個類的功能不夠用了。我自己寫個類,把他的物件傳進來,然後就可以進行加強了,當我寫的功能有問題的時候,就可以把我的注釋掉,然後繼續使用原來的,模組功能還在,專案繼續可以使用。

有以下四個類:

person//共同父類,實現多型用|--

-man//被裝飾物件類|--

-woman//被裝飾物件類|--

-newperson//裝飾類

/**

* 裝飾設計模式:

* 當想要對已有的物件進行功能增強時,

* 可以定義類,將已有物件傳入,基於已有的功能,並提供加強功能。

* 那麼自定義的該類稱為裝飾類。

* * 裝飾類通常會通過構造方法接收被裝飾的物件,

* 並基於被裝飾的物件的功能,提供更強的功能。

* @author liayun

* */

public

class

persondemo}/*

person//共同父類,實現多型用

|---man//被裝飾物件類

|---woman//被裝飾物件類

|---newperson//裝飾類

*//**

* 公共父類(為實現多型)

* @author liayun

* */

class

person

}/**

* 被裝飾的類(被增強物件)

* @author liayun

* */

class

manextends

person

}/**

* 被裝飾的類(被增強物件)

* @author liayun

* */

class

woman

extends

person

}/**

* 裝飾類(要去增強目標物件的類)

* 裝飾類通常會通過構造方法接收被裝飾的物件,

* 並基於被裝飾的物件的功能,提供更強的功能。

* @author liayun

* */

class

newperson

extends

person

void

chifan()

}

Linux效能優化實戰學習筆記 第四十五講

第一點,是網路收發過程中,收發佇列和緩衝區位置的疑問。在 關於 linux 網路,你必須要知道這些 中,我曾介紹過 linux 網路的收發流程。這個流 程涉及到了多個佇列和緩衝區,包括 不過相應的,就會有兩個問題。首先,這些緩衝區的位置在哪兒?是在網絡卡硬體中,還是在記憶體中?這個問題其實仔細想一下...

NeHe OpenGL第四十五課 頂點快取

nehe opengl第四十五課 頂點快取 頂點快取 你想更快地繪製麼?直接操作顯示卡吧,這可是當前的圖形技術,不要猶豫,我帶你入門。接下來,你自己向前走吧。速度是3d程式中最重要的指標,你必須限制繪製的多邊形的個數,或者提高顯示卡繪製多邊形的效率。顯示卡最近增加了乙個新的擴充套件,叫做頂點快取vs...

AGG第四十五課 效能優化

1agg path storage的全域性唯一屬性 理由 內部需要進行記憶體的動態分配,需要開銷開銷,並且會造成記憶體碎片 2 outline aa代替stroke 條件 線寬少於2畫素的情況下,速度稍微提高一些 3 統一在add path之後才render scanline渲染 4 scanlin...