decorator的結(jié)構(gòu)如下:
????MyInterface
???????|
_______|_______
|?????????????|?
Myclass?????Decorator
??????????____|_____
??????????|????????|?
??DecoratorA??????DecoratorB
decorator的目的是在不改變基礎(chǔ)類的前提下,添加新的功能(在比較少的子類前提),Myclass是你的擴(kuò)展類,decoratorA,decoratorB封裝了你要擴(kuò)展的功能,并保持了
MyInterface的引用
考慮一下代碼
public static void main(String[]args){
?
MyInterface a=new Myclass();
??? a.print();
}
?MyInterface是Myclass的接口,在
MyInterface里面就聲明了一個(gè)print方法,myclass實(shí)現(xiàn)了該方法
public void print(){
System.out.print("hello");
}
如果我們要實(shí)現(xiàn)打印 ”hello word“,”my hell“就要要寫很多類似的類,
decorator裝飾模式的解決方法就是,只實(shí)現(xiàn)基本功能,附加功能都抽出來,
public decoratorA
implements?Decorator{
???
MyInterface?myObject;
??? public decoratorA(MyInterface my){
??? ??
myObject=my;
??? }
??? public void print(){
??? ?? System.out.print("
world
");
??? }
}
public decoratorB
implements?Decorator{
???
MyInterface?myObject;
??? public decoratorB(MyInterface my){
??? ??
myObject=my;
??? }
??? public void print(){
??? ?? System.out.print("MY
");
??? ?? ??
myObject.print();
??? }
}
這時(shí)需要實(shí)現(xiàn)my hello word就比較簡單了
public void main(String[]args){
MyInterface a=new
decoratorA (new
decoratorB(new Myclass())
);
a.print();
}
BufferedInputStream?bis?=?new?BufferedInputStream(new?DataInpuStream(new?FileInputStream("xxx.txt")));
InputStream.為例:
? ??? ??? ??? java.io.InputStream
????????????????????????|
?_______________________|________________________
?|?????????????????????????????????????????????|
ByteArrayInputStream??????????????????????FilterInputStream
StringBufferInputStream???_____________________|____________________________
FileInputStream???????????|????????????????|????????????????????|??????????|
PipedInputStream??DataInputStream?BufferedInputStream??LineNumInpuStream PushbackInputStream
基礎(chǔ)的流只有左邊4個(gè),這些流代表了數(shù)據(jù)的來源,所有的流都必須從這四個(gè)中之一開始(注,還有一個(gè)RandomAccessFile、File,這兩個(gè)不在本文介紹范圍)。
當(dāng)我們需要什么新功能的時(shí)候就在右邊找個(gè)裝飾類,在用到緩存的時(shí)候我們就用bufferedInputStream
BufferdInputStream?is?=?new?BufferedInputStream(new?FileInputStream("xxx.txt"));
假如再要DataInputStream的功能,只要在加一層:
DataInputStream?dis?=?new?DataInputStream(new?BufferdInputStream(new?FileInputStream));
posted on 2008-04-20 11:35
緣來如此 閱讀(347)
評(píng)論(0) 編輯 收藏 所屬分類:
Java