1. 程式人生 > >設計模式(五)裝飾模式

設計模式(五)裝飾模式

裝飾者模式:若要擴充套件功能,裝飾者提供了比整合更有彈性的替代方案,動態地將責任附加到物件上。

先簡單描述下裝飾者模式發揮作用的地方,當我們設計好了一個類,我們需要給這個類新增一些輔助的功能,並且不希望改變這個類的程式碼,這時候就是裝飾者模式大展雄威的時候了。這裡還體現了一個原則:類應該對擴充套件開放,對修改關閉。

例子

用裝飾者模式實現在讀取的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裡面的各種流,很痛苦吧,但是當你明

白你們的設計之後就會感覺清晰很多。