定義: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(); } }