• 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

  • 相关阅读:
    H5 + 3D + AR/VR 综述
    10中典型的软件开发模型
    总线宽度VS总线带宽
    最全程序设计流程、技术、工具、交付结果【软件全生命周期】
    一幅图读懂面向对象和面向过程程序设计的区别!
    C语言实现计算器,附源码,超简单!
    request.getRequestDispatcher()的两个方法forward()/include()!!!
    关于使用ResultSet ---结果集没有当前行
    JComboBox添加item的赋值类型问题!不一致的话会导致不能更改jcombobox的选择值
    关于String的两种赋值方式
  • 原文地址:https://www.cnblogs.com/ChromeT/p/11756401.html
Copyright © 2020-2023  润新知