代理模式

  概念:

    1.真实对象:要被代理的对象

    2.代理对象

    3.代理模式 : 代理对象代理真实对象,达到增强真实对象功能的作用

  实现方式:

    1.静态代理:有一个类文件描述代理模式

    2.动态代理:在内存中形成代理类

      * 实现步骤

        1.创建真实对象

          Acer acer = new Acer();

        2.动态代理增强真实对象

          Proxy.newProxyInstance(真实对象的类加载器,真实对象的接口,处理器);

            三个参数:

              1.类加载器 真实对象.getClass().getClassLoader()

              2.接口数组:真实对象.getClass().getInterfaces()

              3.处理器: new InvocationHandler()

                处理器当中有一个invoke()方法,代理逻辑编写的方法,代理对象调用的所有方法都会触发该方法执行

                处理器当中的invoke方法:invoke(Object proxy,Method method,Object[] args)

                  三个参数:

                    1.proxy:代理对象

                    2.method:代理对象调用的方法,被封装为对象(反射)

                    3.args:代理对象调用方法时,传递的实际参数

      

/**
* 定义一个车的接口,行驶和耗油两个方法
*/
public interface Car {
int consume(int i);
int drive();
}

/**
* 一个真实对象
*/
public class BwmCar implements Car{
@Override
public int consume(int i) {
return 10*i;
}
@Override
public int drive(){
return 10;
}
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {

    public static void main(String[] args) {
Car car = new BwmCar(); /**
* 动态代理的三个参数分别为:
*   真实对象的类加载器
*   真实对象的接口
*   处理器
*/
Car proxy_car = (Car) Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//如果是调用的consume的方法
if ("consume".equals(method.getName())) {
Integer value = (Integer) method.invoke(car, args);
value *= 2;
return value;
}
//如果不是consume方法,那么该返回什么就返回什么
return method.invoke(car, args);
}
});
int consume = proxy_car.consume(10);
System.out.println(consume);
car.drive();
System.out.println("========");
BwmCar bwm = new BwmCar();
int bwmCon = bwm.consume(10);
System.out.println(bwmCon);
}
}

  总结:

    正常情况下,都是通过实例化一个类来进行方法的调用.

    模拟一个场景:

      创建了一个接口,然后写一个实现类,来实现这个接口当中的方法,正常情况,实例化这个实现类即可调用这个接口当中的方法.但是,当这个方法的实现效果无法满足要求的时候,可以考虑使用代理模式,增强这个实现类中已经实现的方法​

    【方法定义的三要素:返回值类型/参数列表/方法名】

    【方法执行的三核心:返回值类型/参数列表/方法体(方法执行的业务逻辑)】,增强就是从这三个方面进行增强的.

    增强方式:

      1.增强参数列表

      2.增强返回值类型

      3.增强方法体制性逻辑

  应用场景 : 过滤器等等

代理模式_v1的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. 23种设计模式--代理模式-Proxy

    一.代理模式的介绍       代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...

  3. Spring代理模式及AOP基本术语

    一.代理模式: 静态代理.动态代理 动态代理和静态代理区别?? 解析:静态代理需要手工编写代理类,代理类引用被代理对象. 动态代理是在内存中构建的,不需要手动编写代理类 代理的目的:是为了在原有的方法 ...

  4. Java设计模式之代理模式(Proxy)

    前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...

  5. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

  6. 设计模式(十三)代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  7. php实现设计模式之代理模式

    <?php /* * 代理模式 * 为其他对象提供一种代理以控制对这个对象的访问. * 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  8. PHP 代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问. [代理模式中主要角色] 抽象主题角色:声明了代理主题和真实主题的公共接口,使任何需要真实主题的地方都能用代理主题代替. 代理主题角色:含有真实 ...

  9. java代理模式之静态代理

    作为一个初级开发者,可能不会接触到代理模式,但是在很多框架的使用中都不知不觉使用了代理模式,比如servlet的过滤器链,spring的AOP,以及spring mvc的拦截器等.所以了解代理模式对于 ...

  10. 设计模式-代理模式(Proxy Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...

随机推荐

  1. 浅谈JS输出中的“+”作用问题

    背景(问题) web前端考试有这么一道题目(为了阅读方便和应文章的景,小编将题目进行了微调) <input type="number" value="1" ...

  2. Tensorflow框架实现中的“三”种图

    https://zhuanlan.zhihu.com/p/31308381 图(graph)是 tensorflow 用于表达计算任务的一个核心概念.从前端(python)描述神经网络的结构,到后端在 ...

  3. spring-cloud-alibaba-dubbo踩坑记

    在https://start.aliyun.com/bootstrap.html下载了示例程序,用的版本如下: spring-boot:2.3.7.RELEASE spring-cloud-aliba ...

  4. Ngrinder 制作脚本-(二)

    接上一篇文章:了解了Ngrinder的介绍和工作原理之后,相信大家都想着怎么使用这款工具进行性能测试 一.Ngrinder-Controller 的安装 环境要求: (1)jdk1.8以上 (2)Ja ...

  5. [ARC140D] One to One

    个人思路: 一棵树也只有一个 \(a=-1\) 的点,所以可以把它看做一个点,但是要记录点的大小 \(sz_i\),即为这棵树的大小.如果本来就是一个点,那么大小为 \(1\). 状态:\(dp_{i ...

  6. hive支持的压缩算法

    压缩格式的设置 set mapred.output.compression= 压缩格式 工具 算法 扩展名 是否支持分割 Hadoop编码/解码器 default deflate .deflate N ...

  7. vim 基础

    光标移动(命令模式的上下左右):k,j,h,l 保存/退出 仅保存::w 退出::q(如果有修改要先保存) 保存并退出::wq(x效果一致) 强制退出::q! 模式 命令模式:esc(当前需要处于插入 ...

  8. memoのVIM

    必须给今天看到的vim相关的东西记录一下! vim文档中文化 https://github.com/yianwillis/vimcdoc 速查表 https://github.com/skywind3 ...

  9. 使用signalr不使用连接服务器和前台的js的方法

    1:使用这种方式,,就不需要前后台链接的js 2:新建一个empty的MVC项目 3:新建一个controller和index.html 4: 新建一个signalr 集线器类名为PersonHub, ...

  10. JavaScript基础知识整理(变量)

    变量 ECMAScript变量有两种不同数据类型的值,分别是基本类型和引用类型,两者的不同在于基本类型值是简单的数据段,引用类型值一般指由多个值构成的对象 基本类型 基本数据类型包括5种:Undefi ...