裝飾者模式

定義:java

動態地將這人附加到對象上。想要擴展功能,裝飾者提供有別於繼承的另外一種選擇。編程


一、接口微信

public interface ClassInter {
	void handle();
}

二、直接繼承這個類,所有重寫該方法
ide

public class ClassB implements ClassInter{
	@Override
	public void handle() {
		System.out.println("handleA");
		System.out.println("記錄");
	}
}

三、直接重寫這個類,繼續調用源接口的方法,再添加擴展方法,而後在繼承的方法中直接調用。spa

public class ClassA implements ClassInter{
	@Override
	public void handle() {
		System.out.println("handleA");
	}
}
public class ClassA1 extends ClassA{
	@Override
	public void handle() {
		//不緊須要handle
		super.handle();
		//並且須要記錄用戶
		System.out.println("記錄");
	}
}

四、運行結果
code

handleA
記錄

解釋(對於初學者,你可能感受ClassB更加方便???):對象

一、當團隊開發的時候,不要去在別人的代碼上去動手腳,去擴展你的功能。這樣若是出現問題,就會爭吵繼承

二、當用Maven對於版本的控制的時候,舊版本中沒有新加功能(也沒用那些數據表),那麼升級版本(若是表結構沒有升級),那麼你的代碼就是BUG了。接口

    好比:I8用的是老的微信後臺,如今微信管家加上了數據分析,因爲你的用戶關注和取消關注用的是同一個Handler,那麼對於I8來講,不加上對應的表結構,就會報錯。(同時別人I8根本不須要你的這些功能)
開發

三、也許有人會問你這樣,怎樣在代碼中,去控制同一個代碼調用不一樣的接口呢???

    其實很簡單,你們都用過,只不過真正要寫的時候忘記了。那麼就是接口配置調用(就是把有差別的部分直接寫在配置中)


真正的裝飾者(Java中的文件系統)

一、與上面區別:其實很容易看出來,面向接口編程

二、代碼

public class ClassFile extends FilterInputStream {

	protected ClassFile(InputStream in) {
		super(in);//擴展FilterInputStream
	}

	@Override
	public int read(byte[] b) throws IOException {
		int c = super.read();
		return (c == -1 ?c : Character.toLowerCase((char)c));
	}

	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		int result = super.read(b, off, len);
		for(int i = off ; i <off + result ; i++){
			b[i] = (byte)Character.toLowerCase((char)b[i]);
		}
		return result;
	}
}
public static void main(String[] args) {
		int c;
		InputStream in;
		try {
			//這裏的InputStream先有FileInputStream裝飾,
			//再由BufferedInputStream裝飾,
			//最後由ClassFile裝飾
			in = new ClassFile(
					new BufferedInputStream(
							new FileInputStream("test.txt")));

		while ((c = in.read()) >= 0) {
			System.out.println((char)c);
		}
		in.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息