1.代理模式(Proxy Pattern)

一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

1.1意图:

为其他对象提供一种代理以控制对这个对象的访问。

1.2主要解决:

在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

1.3何时使用:

想在访问一个类时做一些控制。

1.4如何解决:

增加中间层。

1.5关键代码:

实现与被代理类组合。

1.6应用实例:

1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

1.7优点:

1、职责清晰。 2、高扩展性。 3、智能化。

1.8缺点:

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

1.9使用场景:

按职责来划分,通常有以下使用场景: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。

1.10注意事项:

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

1.11代码示例(一)静态代理


package com.xql.designpattern.controller.proxy.staticproxy;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub//创建目标对象(被代理对象)TeacherDao teacherDao = new TeacherDao();//创建代理对象, 同时将被代理对象传递给代理对象TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);//通过代理对象,调用到被代理对象的方法//即:执行的是代理对象的方法,代理对象再去调用目标对象的方法teacherDaoProxy.teach();}}
package com.xql.designpattern.controller.proxy.staticproxy;//代理对象,静态代理
public class TeacherDaoProxy implements ITeacherDao{private ITeacherDao target; // 目标对象,通过接口来聚合//构造器public TeacherDaoProxy(ITeacherDao target) {this.target = target;}@Overridepublic void teach() {// TODO Auto-generated method stubSystem.out.println("开始代理  完成某些操作。。。。。 ");//方法target.teach();System.out.println("提交。。。。。");//方法}}
package com.xql.designpattern.controller.proxy.staticproxy;//接口
public interface ITeacherDao {void teach(); // 授课的方法
}
package com.xql.designpattern.controller.proxy.staticproxy;public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {// TODO Auto-generated method stubSystem.out.println(" 老师授课中  。。。。。");}}

1.12代码示例(二)动态代理

package com.xql.designpattern.controller.proxy.dynamic;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub//创建目标对象ITeacherDao target = new TeacherDao();//给目标对象,创建代理对象, 可以转成 ITeacherDaoITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();// proxyInstance=class com.sun.proxy.$Proxy0 内存中动态生成了代理对象System.out.println("proxyInstance=" + proxyInstance.getClass());//通过代理对象,调用目标对象的方法//proxyInstance.teach();proxyInstance.sayHello(" tom ");}}
package com.xql.designpattern.controller.proxy.dynamic;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyFactory {//维护一个目标对象 , Objectprivate Object target;//构造器 , 对target 进行初始化public ProxyFactory(Object target) {this.target = target;}//给目标对象 生成一个代理对象public Object getProxyInstance() {//说明/**  public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)//1. ClassLoader loader : 指定当前目标对象使用的类加载器, 获取加载器的方法固定//2. Class<?>[] interfaces: 目标对象实现的接口类型,使用泛型方法确认类型//3. InvocationHandler h : 事情处理,执行目标对象的方法时,会触发事情处理器方法, 会把当前执行的目标对象方法作为参数传入*/return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// TODO Auto-generated method stubSystem.out.println("JDK代理开始~~");//反射机制调用目标对象的方法Object returnVal = method.invoke(target, args);System.out.println("JDK代理提交");return returnVal;}});}}
package com.xql.designpattern.controller.proxy.dynamic;//接口
public interface ITeacherDao {void teach(); // 授课方法void sayHello(String name);
}
package com.xql.designpattern.controller.proxy.dynamic;public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {// TODO Auto-generated method stubSystem.out.println(" 老师授课中.... ");}@Overridepublic void sayHello(String name) {// TODO Auto-generated method stubSystem.out.println("hello " + name);}}

1.12代码示例(三)cglib代理

package com.xql.designpattern.controller.proxy.cglib;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub//创建目标对象TeacherDao target = new TeacherDao();//获取到代理对象,并且将目标对象传递给代理对象TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();//执行代理对象的方法,触发intecept 方法,从而实现 对目标对象的调用String res = proxyInstance.teach();System.out.println("res=" + res);}}
package com.xql.designpattern.controller.proxy.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class ProxyFactory implements MethodInterceptor {//维护一个目标对象private Object target;//构造器,传入一个被代理的对象public ProxyFactory(Object target) {this.target = target;}//返回一个代理对象:  是 target 对象的代理对象public Object getProxyInstance() {//1. 创建一个工具类Enhancer enhancer = new Enhancer();//2. 设置父类enhancer.setSuperclass(target.getClass());//3. 设置回调函数enhancer.setCallback(this);//4. 创建子类对象,即代理对象return enhancer.create();}//重写  intercept 方法,会调用目标对象的方法@Overridepublic Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {// TODO Auto-generated method stubSystem.out.println("Cglib代理模式 ~~ 开始");Object returnVal = method.invoke(target, args);System.out.println("Cglib代理模式 ~~ 提交");return returnVal;}}
package com.xql.designpattern.controller.proxy.cglib;public class TeacherDao {public String teach() {System.out.println(" 老师授课中  , 我是cglib代理,不需要实现接口 ");return "hello";}
}

JAVA设计模式--结构型模式--代理模式相关推荐

  1. 设计模式(结构型)之代理模式(Proxy Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  2. Java设计模式之结构型:代理模式

    前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做:再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们 ...

  3. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  4. JAVA设计模式--结构型模式

    2019独角兽企业重金招聘Python工程师标准>>> 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模 ...

  5. 每天学习一个设计模式(七):结构型之代理模式

    目录 一.基本概念 二.通俗解释 三.代理模式的分类 1.普通代理 2.强制代理 代理是有个性的 3.动态代理 一.基本概念 代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下 ...

  6. Java设计模式(13)----------代理模式

    原文:https://www.imooc.com/article/24850 默课道可工程师学习地址:https://www.imooc.com/article/24850 介绍 代理模式中,在客户端 ...

  7. 【强烈推荐】Java设计模式:怒肝代理模式,可真把我榨干了!

    你的一键三连是我巨大的动力! 设计模式系列 工厂模式 (程序员必知必会) 单例模式 (程序员必知必会) 一.什么是代理模式? 其实代理模式不仅仅只存在编程中,你细想人生处处不代理呢? 一家公司老板身边 ...

  8. Java设计模式之JDK动态代理模式

    先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...

  9. Java设计模式-结构型-门面模式

    目录 前言 示例 前言 门面模式(也叫外观模式,Facade Pattern)在许多源码中有使用,比如 slf4j 就可以理解为是门面模式的应用.这是一个简单的设计模式,我们直接上代码再说吧. 示例 ...

最新文章

  1. DeepFake 入门了解
  2. 设计模式复习-模板方法模式
  3. UWA DAY 2018 精彩议题全曝光!
  4. thinkphp如何跨模块调用方法呢?
  5. 提高方面级情感分析的性能:一种结合词汇图和句法图的方法
  6. ASP.NET中的FILE对象总结
  7. 上海大学计算机学院师资力量,计算机学院张瑞老师荣获第二届上海高校青年教师教学竞赛决赛二等奖...
  8. docker image设置jdk版本_使用Docker搭建Java环境的步骤方法
  9. 前端页面加载速度优化---Ngnix之GZIP压缩
  10. C语言例题——简易秒表
  11. DoS攻击原理与实战(LOIC+Hping3)
  12. 浸没式液冷,阿里云新立项两大技术白皮书
  13. 2022年7月深圳地区CPDA数据分析师认证
  14. 查看电脑CPU是否支持虚拟化
  15. 林轩田《机器学习基石》笔记
  16. hb运行到微信小程序出现报错:[微信小程序开发者工具] ? Enable IDE Service (y/N) 
  17. 微信怎么找群聊?找回微信群聊只需要这样…
  18. 中国矿业大学计算机保研去向,喜报!中国矿业大学1065人被保研到北大、清华等校,名单已公布!...
  19. BIO、NIO、AIO网络编程
  20. 在微信里接收文件后如何指着文件用咱编的APP打开?

热门文章

  1. Vue2 生命周期 详细讲解+图示
  2. Java神操作之SpringBoot基础上添加Kotlin混合开发
  3. PTA Swan学院社团招新(sort排序)
  4. 谷歌优化排名怎么做?Google SEO怎么优化?
  5. 内网渗透测试 MSF搭建socks代理
  6. 【数学建模】CUMCM-2013B 碎纸片的拼接复原 解题思路整理
  7. E: 错误,pkgProblemResolver::Resolve 发生故障,这可能是有软件包被要求保持现状的缘故。
  8. 计算机专业处理器和显卡,45.显卡篇-处理器显卡和独立显卡哪个好-电脑自学网...
  9. seo外链建设(如何正确做好seo网站外链建设)
  10. 单片机流星灯_51单片机流星灯c语言源程序