设计模式之代理模式(动态代理)

动态代理也就是JVM给我们提供的动态的接口,我们的代理类不需要去实现凌驾于被委托者的接口。
还是拿小刚替小明写作业为例。
首先定义写作业者的接口

interface Homeworker {
    //语文作业
     void chinese();
    //数学作业
     void math();
    //英语作业
     void english();
}

下来土豪朋友实现了这个接口(必须是接口)

public class Wealthy implements Homeworker {
    private String hName = "";
    public Wealthy(String hName) {
        this.hName = hName;
    }
    public void chinese() {
        System.out.println(hName + "写完了语文作业");
    }
    public void math() {
        System.out.println(hName + "写完了数学作业");
    }
    public void english() {
        System.out.println(hName + "写完了英语作业");
    }
}

自定义的被委托类实现了InvocationHandler接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class WealthyIH implements InvocationHandler {
    //被代理者
    Class cls = null;
    //被代理的实例
    Object obj = null;
    //我要代理谁
    public WealthyIH(Object obj){
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(this.obj,args);
        String mName = method.getName();
        System.out.println("哥们我替你写完"+mName+"作业了");
        return result;
    }
}

最后看看场景

public class Client {
    public static void main(String[] args) {
        Wealthy wealthy = new Wealthy("小明");
        InvocationHandler handler = new WealthyIH(wealthy);
        ClassLoader cl = wealthy.getClass().getClassLoader();
        Homeworker proxy = (Homeworker) Proxy.newProxyInstance(cl,new Class[]{Homeworker.class},handler);
        proxy.chinese();
        proxy.math();
        proxy.english();
    }
}

在这里插入图片描述
土豪类甚至不知道有个能帮他写作业的,而写作业的不光能写作业还能完成其他的委托。这就大大降低了委托类与被委托类的耦合。直到Client时才进行耦合,被委托方就好像切进来一样所以又称之为面向横切面编程(AOP)

猜你喜欢

转载自blog.csdn.net/qq_43313769/article/details/86437991