一.代理模式介绍

  代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程

   其中代理又分为:静态代理和动态代理

     静态代理:指的是自己要写一个代理类,或者用工具生成一个代理类,总之就是程序运行之前已经存且编译好的代理类.(自己写的类)
     动态代理:指由JVM虚拟机程序运行时产生的代理类。(jvm或第三方生成的类)

  动态类具有更强的灵活性,它不用在我们设计实现类时指定哪个类被代理了。

二.动态代理

  覆盖InvocationHandler接口中的invoke()方法,更重要的是,动态代理模式可以使得我们在不改变原来已有的代码结构的情况下,对原来的原有进行扩展、增强其功能,并且可以达到控制被代理对象的行为。

  每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。

public class DynamicProxy implements InvocationHandler{// 被代理类的实例
    Object proxy;public DynamicProxy(Object proxy) {this.proxy = proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(this.proxy, args);return null;}}public interface ProxySSSS {public void buyCar(int cash);
}public class User implements ProxyInterface{private int cash; //花费private String name;public User(int cash,String name){this.cash = cash;this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCash() {return cash;}public void setCash(int cash) {this.cash = cash;}public void buyCar() {System.out.println("花 "+cash +"钱买车");}}

动态代理测试类

public class MainTest {public static void main(String[] args) {User user = new User("张三",1000);InvocationHandler handler = new DynamicProxy(user);/*** 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:* Proxy.newProxyInstance 3个参数的意思:*            handler.getClass().getClassLoader() : 获取代理类的加载 器来加载动态代理类对象*         user.getClass().getInterfaces()        : 该对象的方法就是代理类所代理的方法*         handler                                : InvocationHandler 对象*/ProxySSSS instance = (ProxySSSS)Proxy.newProxyInstance(handler.getClass().getClassLoader(), user.getClass().getInterfaces(), handler);instance.buyCar(user.getCash());}
}

  

转载于:https://www.cnblogs.com/MrRightZhao/p/10815311.html

java23种设计模式之五:代理模式相关推荐

  1. 一天一种设计模式之五-----代理模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.代理模式简介 代理模式属于结构型模式 定义:代理模式为其他对象提供一种代理以控制对这个对象的访问. 代理模式是java框架 ...

  2. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  3. 带你认识4种设计模式:代理模式、装饰模式、外观模式和享元模式

    摘要:本文我们主要介绍结构型模式中的代理模式.装饰模式.外观模式和享元模式. 本文分享自华为云社区<快来,这里有23种设计模式的Go语言实现(三)>,原文作者:元闰子 . 设计模式(Des ...

  4. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  5. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之代理模式

    · 代理模式在王者荣耀中的应用 · 应用一(虚拟代理模式) 应用二(远程代理模式) 应用三(充值送好礼) 一.简述 应用一: 在王者荣耀这款游戏里,设置有很多种娱乐游戏模式,比如:无限乱斗.梦境大乱斗 ...

  6. 23种设计模式之代理模式(动态代理)

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

  7. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这 ...

  8. Java23种设计模式之工厂模式

    工厂模式 前言 一.简单工厂模式 二.工厂方法模式 优点: 缺点: 三.工厂方法模式适合应用场景 总结 前言 核心本质: 1.实例化对象不使用new,用工厂方法代替, 2.将选择实现类,创建对象统一管 ...

  9. 23三种设计模式之代理模式

    一.概念 通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用 ...

最新文章

  1. js取一定范围内的随机整数
  2. JS控制图片显示的大小(图片等比例缩放)
  3. 计算机组成原理we指什么,计算机组成原理课后习题答案一到九章
  4. 科大星云诗社动态20210315
  5. idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件
  6. mysql静默安装_oracle静默安装文件db_install.rsp详解
  7. linux对web后端重要吗,基于Linux的Web服务器性能测试
  8. perl里q,qq,qw等的用法
  9. mac系统下设置eclipse的补全快捷键方法
  10. Win10系统,ColorPix取色位置偏移如何解决?
  11. 小程序体验版无法显示内容
  12. BZOJ 2101 [Usaco2010 Dec]Treasure Chest 藏宝箱:区间dp 博弈【两种表示方法】【压维】...
  13. 再见2018,你好2019!
  14. 【寻找最佳小程序】03期:摩拜单车小程序——联合微信团队打造,实现不换码一扫即用
  15. 电脑连接打印机并共享及其他打印机连接
  16. 《爱乐之城》配色分享
  17. Java将.docx文件转换为.pdf文件
  18. python编程语言零基础入门-零基础学习编程,Java、Python你会选择哪个?
  19. ecdsa JAVA 私钥推导公钥_ECDSA(椭圆曲线数字签名算法)
  20. SCI论文写作神器集合 —— 超级实用

热门文章

  1. linux如何移动数据到文件系统,怎么把数据文件从文件系统移动到asm?
  2. oracle 赋值到cmd,CMD操作oracle数据导库过程图解
  3. linux100day(day7)--用户管理和权限管理简单介绍
  4. 第一个Python程序hello.py提示出现File stdin,line 1错误
  5. Docker入门(CentOS7)
  6. CentOS7安装Docker与使用篇
  7. .NET 4.5 Task异步编程学习资料
  8. 懒加载 jquery代码
  9. 淘宝API调用 申请 获取session key
  10. C#学习笔记——软件注册与注册机