代理模式的含义是:不直接地去执行一些业务逻辑,而是由该类的代理类去执行相应的其他业务,如AOP,除了主线的业务逻辑,相对应的日志输出,通过代理的方式去执行,输出,实现剥离非业务的部分,使得逻辑更加的情形。
通俗的举例,就是老妈让你去打酱油,她自己不去打,而是让你代替她去打酱油,但是最终的酱油是相当于到了老妈的手中,和老妈亲自去买了一瓶酱油的结果是一样的。
上面的架构中,代理的部分负责通知的功能,而subject,负责执行主线的业务逻辑,两者之间没有必然的耦合关系,通知的advice从另一个切面切入,最终在client 进行耦合,这样就可以实现advice的部分和主线的subject 部分互不干扰
代理类
public class DynamicProxy {
public static T newProxyInstance(ClassLoader loader,
Class>[] interfaces,
InvocationHandler handler) {
if (true) {
(new BeforeAdvice()).exec();
}
return (T) Proxy.newProxyInstance(loader, interfaces, handler);
}
} 通知接口
public interface IAdvice {
public void exec();
}实现类
public class BeforeAdvice implements IAdvice {
@Override
public void exec() {
System.out.println("action before advice!!!");
}
}业务逻辑
public interface Subject {
public void doSomething(String str);
}实现类
public interface Subject {
public void doSomething(String str);
}代理
public class MyInvocationHandler implements InvocationHandler {
private final Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(this.target,args);
}
}public class Client {
public static void main(String[] args) {
Subject subject = new RealSubject();
InvocationHandler handler = new MyInvocationHandler(subject);
ClassLoader classLoader = subject.getClass().getClassLoader();
Class>[] interfaces = subject.getClass().getInterfaces();
//主题的代理
Subject proxy = DynamicProxy.newProxyInstance(
classLoader,
interfaces,
handler
);
proxy.doSomething("done.....");
}
}分析:
从最后的client 进行分析,要使用代理,注意 c.getInterfaces()这句话,这是非常有意思的一句话,是说查找到该类的所有接口,然后实现接口的所有方法。当然了,方法都是空的,由谁具体负责接管呢?是new MyInvocationHandler(_Obj)这个对象。于是我们知道一个类的动态代理类是这样的一个类, 由InvocationHandler的实现类实现所有的方法,由其invoke方法接管所有方法的实现。
版权声明:我们致力于保护作者版权,注重分享,被刊用文章【代理的意思(设计模式之)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;
工作时间:8:00-18:00
客服电话
电子邮件
beimuxi@protonmail.com
扫码二维码
获取最新动态
