其他分享
首页 > 其他分享> > 代理模式

代理模式

作者:互联网

在某些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。

现实生活中场景:

程序场景:

定义:

由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不合适或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

优点:
缺点:

模式结构:

主要角色:

1.抽象主题类:通过接口或者抽象类声明真实主题和代理对象的业务方法。

2.真实主题类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

3.代理类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

 

在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知。

代理的分类:

根据代理的创建时期,代理模式分为静态代理和动态代理。

静态代理:

示例:

public class ProxyTest {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.Request();
    }
}
//抽象主题
interface Subject {
    void Request();
}
//真实主题
class RealSubject implements Subject {
    public void Request() {
        System.out.println("访问真实主题方法...");
    }
}
//代理
class Proxy implements Subject {
    private RealSubject realSubject;
    public void Request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.Request();
        postRequest();
    }
    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }
    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }
}

运行结果:

访问真实主题之前的预处理。
访问真实主题方法...
访问真实主题之后的后续处理。
应用场景:

动态代理-代理模式的扩展

在静态代理模式中,代理类中包含了对真实主题的引用,这种方式存在两个缺点。

  1. 真实主题与代理主题必须一一对应,增加真实主题也要增加代理。

  2. 设计代理之前真实主题必须事先存在,不太灵活。

示例:

public interface IPerson {
    void findTeacher(); //找老师
}
public class JdkFuDao implements InvocationHandler {
    private IPerson target;
    public IPerson getInstance(IPerson target) {
        this.target = target;
        Class<?> clazz = target.getClass();
        return (IPerson) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(this.target, args);
        after();
        return result;
    }
    private void after() {
        System.out.println("双方同意,开始辅导");
    }
    private void before() {
        System.out.println("已经收集到您的需求,开始挑选老师");
    }
}
public class ZhaoLiu implements IPerson {
    @Override
    public void findTeacher() {
        System.out.println("符合赵六的要求");
    }
    public void buyInsure() {
    }
}
public class Test {
    public static void main(String[] args) {
        JdkFuDao jdkFuDao = new JdkFuDao();
        IPerson zhaoliu = jdkFuDao.getInstance(new ZhaoLiu());
        zhaoliu.findTeacher();
    }
}

核心原理:向代理中传入需要反射创建的对象。

静态代理与动态代理的区别:

 

标签:真实,对象,void,主题,代理,模式,public
来源: https://www.cnblogs.com/l12138h/p/16306336.html