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