13 【结构型】代理模式~ 理解与使用

代理模式

代理模式,通俗的话说:就是代理,代理这个词我们也经常用,比如代理一个人办事,就是因为那个人不方便去办理,委托一个人去代理他

办理,这里我们就用这个最基础的模型来说明代理模式:

简单理解:

因为对象不能直接访问,或者直接访问存在问题,这时候就需要在我们和被访问的对象之间加一层访问层,通过访问层来间接的访问对象的方法

 

灵魂画师 开始

 

老司机们都懂,大家都懂,这个图用来说代理模式,实在是再合适不过了!!

 

这里涉及到三个需要说明的对象

真实对象:这里的Google是真实对象,它具有可以检索的方法。

代理对象:代理对象可以简单的理解为就是真实对象的一个副本,可以直接拿过来用。

处理器:处理器就是如何来调用代理后对象的方法的一个类

 

代码理解:

定义一个google的接口,这里可以进行搜索内容

public interface Google {
    //搜索内容
    int selectContext();

}

去实现这个接口,并且调用这个接口的时候,我们表示出,它正在搜索内容

public class MyGoogle implements Google {

    @Override
    public int selectContext() {

        System.out.println("google 搜索引擎检索中。。。。");

        return 0;
    }
}

 

注意:这里实现了Java自带的一个类,InvocationHandler 用于实现处理器,处理器用来处理相关逻辑

public class MyInvocationHandler implements InvocationHandler {

    //真实调用的对象
    private Google google;

    public MyInvocationHandler(Google google) {
        this.google = google;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("代理类处理before.....");

        int invoke = (int) method.invoke(google, args);

        System.out.println("处理结果:" + invoke);

        System.out.println("代理类处理after.....");

        return invoke;
    }
}

 

这就和Spring AOP 切面编程里面的代理是一样的,在代理的方法之前做一件事情,方法后做一件事情

 

这里我们未直接调用google的检索方法,而是调用代理对象的检索方法,实现同样的效果,

    public static void main(String[] args) {

        //真实对象
        Google google = new MyGoogle();

        //处理器
        MyInvocationHandler invocationHandler = new MyInvocationHandler(google);

        //代理对象
        Google proxyMapper= (Google) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Google.class},invocationHandler);

        proxyMapper.selectContext();

    }

 

 

 

 

参考内容:https://www.runoob.com/design-pattern/proxy-pattern.html

https://www.jianshu.com/p/d0ee1ca57f14

 

码云:https://gitee.com/mrc1999/23GOF

 

posted @ 2019-10-28 23:49  程序猿小码  阅读(353)  评论(0编辑  收藏  举报