現在有以下需求:要實現自己的一套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...