大家写代码的时候会发现需要对某个类的功能添加新的功能、条件、判断等,这时候就会对这个方法上进行修改,但是这个方法被很多其他的地方引用,不方便修改。这时候大家就会新建一个方法,把原本的方法复制过去,再修改。这样的话也可以。但是多次这样操作的话会导致类很臃肿,而且后期修改不好维护。代理可以解决这个。在原本的方法上实现拓展修改,又不影响这个方法在其他的地方引用。
首先用接口把这个方法提取出来:
public interface ISay { void say(); }
其次这个方法原本功能实现:
public class English implements ISay{ @Override public void say() { System.out.println("我会说英语。。。"); } }
最后拓展:
public class EnglishProxy implements ISay{ private ISay iSay; public EnglishProxy(ISay iSay) { this.iSay = iSay; } @Override public void say() { //这是添加的功能 System.out.println("我是中国人"); //这是原本的功能 iSay.say(); } }
这个是静态代理,代理类和目标类有相同的父类。
动态代理的话就是这样:
public class EnglishDynamic { private ISay iSay; public EnglishDynamic(ISay iSay) { this.iSay = iSay; } public void say(){ ISay diSay = (ISay) Proxy.newProxyInstance(iSay.getClass().getClassLoader(), iSay.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { //这是添加的功能 System.out.println("我是中国人"); //这是原本的功能 method.invoke(iSay,objects); return null; } }); diSay.say(); } }
动态代理不需要和目标类具有相同的父类,使用Proxy的newProxyInstance方法,回调InvocationHandler接口,实现功能的拓展