裝飾者模式(decorator)--給愛用繼承的人一個全新的設計眼界
阿新 • • 發佈:2019-02-02
[color=red][b]裝飾者模式:動態的將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
設計原則:對擴充套件開放,對修改關閉。 [/b][/color]
jdk中io採用了這種設計模式,來看一下io的類圖先。
[img]http://dl.iteye.com/upload/attachment/150650/56366597-c448-391a-a53c-ebfa2d6a35a8.jpg[/img]
FilterInputStream作為一個抽象的裝飾者,他的子類可將被裝飾者進行包裝。
現在我們需要將輸入的內容全部轉換為大寫,來設計擴充套件這樣一個裝飾者。
測試類如下:
UpperCaseFileInputStream對FileInputStream進行了有效的擴充套件,遵循了修改關閉,擴充套件開放的設計原則。
當然,在這裡FilterInputStream作為一個抽象的裝飾者也實現了一些被裝飾者的方法,在這裡為了更加清晰的展示裝飾者模式並沒有直接使用父類方法。
設計原則:對擴充套件開放,對修改關閉。 [/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作為一個抽象的裝飾者也實現了一些被裝飾者的方法,在這裡為了更加清晰的展示裝飾者模式並沒有直接使用父類方法。