1. 程式人生 > >裝飾者模式(decorator)--給愛用繼承的人一個全新的設計眼界

裝飾者模式(decorator)--給愛用繼承的人一個全新的設計眼界

[color=red][b]裝飾者模式:動態的將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

設計原則:對擴充套件開放,對修改關閉。 [/b][/color]

jdk中io採用了這種設計模式,來看一下io的類圖先。

[img]http://dl.iteye.com/upload/attachment/150650/56366597-c448-391a-a53c-ebfa2d6a35a8.jpg[/img]

FilterInputStream作為一個抽象的裝飾者,他的子類可將被裝飾者進行包裝。

現在我們需要將輸入的內容全部轉換為大寫,來設計擴充套件這樣一個裝飾者。



/**
* @author edison
* @date 2009-9-25
*/
public class UpperCaseFileInputStream extends FilterInputStream{

FileInputStream fis=null;

protected UpperCaseFileInputStream(InputStream in) {
super(in);
fis=(FileInputStream)in;
}

public UpperCaseFileInputStream(File f) throws FileNotFoundException{
this(new FileInputStream(f));
}

public int readForUpperCase(byte[] b){
int tmp = 0;
try {
fis.read(b);
/**
* FilterInputStream裡實現了這樣一個read方法,
* 所以我們也可以直接用父類的read方法。
* 這裡用fis.read()是為了更好的展示裝飾者模式。
*/
//read(b);
} catch (IOException e) {
e.printStackTrace();
}

for(int i=0;i<b.length;i++){
b[i]=(byte)Character.toUpperCase((char)b[i]);
}

return tmp;
}
}


測試類如下:



/**
* @author edison
* @date 2009-9-25
*/
public class TestMyInputStream {

public static void main(String[] args) throws IOException{

File file=new File("C:\\Users\\yang\\Desktop\\abc");
UpperCaseFileInputStream ucfis=new UpperCaseFileInputStream(file);

byte[] b=new byte[(int)file.length()];
int tmp=ucfis.readForUpperCase(b);
String str=new String(b);

System.out.print("the file's content is: "+str);

ucfis.close();
}
}


UpperCaseFileInputStream對FileInputStream進行了有效的擴充套件,遵循了修改關閉,擴充套件開放的設計原則。

當然,在這裡FilterInputStream作為一個抽象的裝飾者也實現了一些被裝飾者的方法,在這裡為了更加清晰的展示裝飾者模式並沒有直接使用父類方法。