設計模式(五)裝飾模式
阿新 • • 發佈:2018-12-09
裝飾者模式:若要擴充套件功能,裝飾者提供了比整合更有彈性的替代方案,動態地將責任附加到物件上。
先簡單描述下裝飾者模式發揮作用的地方,當我們設計好了一個類,我們需要給這個類新增一些輔助的功能,並且不希望改變這個類的程式碼,這時候就是裝飾者模式大展雄威的時候了。這裡還體現了一個原則:類應該對擴充套件開放,對修改關閉。
例子
用裝飾者模式實現在讀取的txt檔案內 每個名字前加編號
裝飾者模式過程: * 1.建立一個裝飾類(MyBufferedReader)繼承被裝飾類(BufferedReader) * 2.建立一個成員變數 型別為被裝飾類 * 3.建立構造方法 用第二步建立的成員變數接收傳入的裝飾類 * 4.複寫之前裝飾類中你要增強的方法
public class MyBufferedReader extends BufferedReader{ private BufferedReader br; public MyBufferedReader(Reader in) { super(in); this.br=(BufferedReader)in; } int num=1; @Override public String readLine() throws IOException { String str=br.readLine(); if(str!=null){ str=num+":"+str; num++; } return str; }
public class BufferReader { public static void main(String[] args) throws Exception { FileReader fr=new FileReader("C:/Users/Administrator/Desktop/test.txt"); MyBufferedReader br=new MyBufferedReader(new BufferedReader(fr)); String str=null; while((str=br.readLine())!=null){ System.out.println(str); } br.close(); } }
例子2給武器鑲嵌寶石
武器介面
public interface WuQi {
//計算攻擊力
public int calculate();
//描述
public String descript();
}
具體武器斧頭也是被裝飾者
public class FuTou implements WuQi{
@Override
public int calculate() {
//斧頭攻擊力5
return 5;
}
@Override
public String descript() {
return "斧頭";
}
}
寶石介面繼承武器介面 裝飾者繼承被裝飾者
public interface BaoShi extends WuQi{
}
紅寶石裝飾者
public class RedBaoShi implements BaoShi{
//成員變數為被裝飾者
private WuQi wuqi;
//傳入被裝飾者
public RedBaoShi(WuQi wuqi){
this.wuqi=wuqi;
}
@Override
public int calculate() {
return 5+wuqi.calculate();
}
@Override
public String descript() {
return wuqi.descript()+"裝備紅寶石+1 ";
}
}
測試
public class Test {
public static void main(String[] args) {
WuQi wuqi =new RedBaoShi(new RedBaoShi(new RedBaoShi(new FuTou()))) ;
System.out.println(wuqi.calculate());
System.out.println(wuqi.descript());
}
}
結果:10 斧頭裝備紅寶石+1
這樣在不改變斧頭原有方法的同時,添加了裝飾寶石。使被裝飾者斧頭的攻擊力更強。
Java的API中也有裝飾者模式的身影,如果你初學Java,一定記得Java裡面的各種流,很痛苦吧,但是當你明
白你們的設計之後就會感覺清晰很多。