关于代理模式:详解代理模式的基本结构和原理

详解代理模式的根本构造和原理代理模式是一种罕用的设计模式,它为其余对象提供了一个代理,以管制对这个对象的拜访。代理模式能够用来限度拜访、实现近程拜访、提早加载等性能。在本文中,咱们将具体介绍代理模式的根本构造和原理,并通过一个例子来阐明代理模式的利用。 根本构造代理模式由三局部组成:形象主题(Subject)、实在主题(RealSubject)和代理(Proxy)。形象主题定义了实在主题和代理的公共接口,实在主题是被代理的对象,代理对象与实在主题实现雷同的接口,以便于代理对象能够代替实在主题,而代理则负责管制对实在主题的拜访。 在代理模式中,客户端不间接拜访实在主题,而是通过代理来拜访实在主题。代理在实现客户申请之前,能够进行一些预处理操作,比方记录日志、验证权限等。代理还能够在拜访实在主题前后进行一些操作,比方缓存数据、提早加载等。 原理解析代理模式的原理非常简单。客户端通过代理来拜访实在主题,代理先进行一些预处理操作,而后将申请传递给实在主题。实在主题实现申请后,将后果返回给代理。 代理再将后果返回给客户端。代理模式能够用来实现各种性能,比方限度拜访、近程拜访、提早加载等。上面咱们将别离介绍这些利用场景。 限度拜访代理模式能够用来限度拜访。在这种状况下,代理会对客户申请进行验证,以确保只有具备特定权限的用户能力拜访实在主题。例如,一个网站可能会应用代理来限度对某些页面的拜访,只有登录用户能力拜访这些页面。 上面是一个示例程序: public interface Subject { void request();}public class RealSubject implements Subject { public void request() { System.out.println("RealSubject.request()"); }}public class Proxy implements Subject { private Subject realSubject; private String password; public Proxy(String password) { this.password = password; this.realSubject = new RealSubject(); } public void request() { if (password.equals("secret")) { realSubject.request(); } else { System.out.println("Access denied"); } }}public class Client { public static void main(String[] args) { Subject subject = new Proxy("secret"); subject.request(); // RealSubject.request() Subject subject2 = new Proxy("wrong password"); subject2.request(); // Access denied }}在这个例子中,咱们定义了一个形象主题接口 Subject 和一个实在主题类 RealSubject。而后咱们定义了一个代理类 Proxy,并在构造函数中传入一个明码参数。当客户端调用 request() 办法时,代理会先查看明码是否正确,而后将申请转发给实在主题。如果明码不正确,代理会回绝拜访。 ...

May 24, 2023 · 2 min · jiezi

关于代理模式:设计模式代理模式

1.1 根本介绍代理模式:为一个对象提供一个替身,以管制对这个对象的拜访,即通过代理对象拜访指标对象。这样做的益处是:能够在指标对象实现的根底上,加强额定的性能操作,即扩大指标对象的性能。被代理的对象能够是近程对象、创立开销大的对象或须要安全控制的对象。代理模式有不同的模式,次要有三种 动态代理、动静代理 (JDK代理、接口代理)和 Cglib 代理 (能够在内存动静的创建对象,而不须要实现接口, 他是属于动静代理的领域) 。代理模式示意图 1.2 动态代理1.2.1 根本介绍动态代理在应用时,须要定义接口或者父类,被代理对象(即指标对象)与代理对象一起实现雷同的接口或者是继承雷同父类。 1.2.2 利用实例思路剖析图解(类图) 代码实现 创立 ITeachService 接口 public interface ITeachService { /** * 教学方法 */ public void teach();}创立 TeachService 实现类 public class TeachService implements ITeachService{ @Override public void teach() { System.out.println(" 开始上课... "); }}创立 TeachServiceProxy 代理类 public class TeachServiceProxy implements ITeachService{ private TeachService teachService; public TeachServiceProxy(TeachService teachService) { this.teachService = teachService; } @Override public void teach() { System.out.println(" 筹备上课... "); teachService.teach(); System.out.println(" 完结上课... "); }}创立客户端调用 ...

August 16, 2022 · 3 min · jiezi

关于代理模式:设计模式之代理设计模式

原文首发于微信公众号:jzman-blog,欢送关注交换!明天来看一下什么是代理设计模式,顾名思义,代理就是通过中介代替某人做某一件事,对应到咱们的程序中就是通过代理对象来管制某个具体对象某个办法的拜访,在该办法之前和之后能够做一些额定解决。 概念了解动态代理动静代理概念了解形象角色:用于定义实在角色和代理角色共有的办法。实在角色:实在角色要实现的具体业务逻辑以供代理角色调用。代理角色:用于代理实在角色,可在实在角色具体逻辑前后进行额定解决。那么代理的意义在于,当须要具体的业务逻辑时才调用实在角色的具体业务办法,即与实在角色具体业务逻辑无关的解决都放在代理类中的解决。 动态代理先来看一下动态代理的代码实现,定义形象角色申明共用的业务逻辑,具体如下: /** * 形象角色 * @author jzman */public interface IBusiness { /** * 购物 */ void buy();}而后,创立实在角色并实现具体的业务逻辑,具体如下: /** * 实在角色 * @author jzman */public class RealRole implements IBusiness{ @Override public void buy() { System.out.println("我要买货色"); }}而后,创立代理角色,在进行具体业务逻辑的时候必须调用实在角色的业务逻辑办法,具体如下: /** * 代理角色 * @author jzman */public class ProxyRole implements IBusiness{ private IBusiness mRealRole; public ProxyRole(IBusiness realRole) { this.mRealRole = realRole; } @Override public void buy() { //购买之前的额定评估 System.out.println("购买之前的额定评估..."); //具体的业务逻辑 mRealRole.buy(); //购买之后的满意度考察 System.out.println("购买之后的满意度考察..."); }}最初,应用方才创立的相干动态代理类,具体如下: ...

June 24, 2021 · 1 min · jiezi

关于代理模式:5代理模式

代理模式应用代理对象来代替对实在对象(real object)的拜访,这样就能够在不批改原指标对象的前提下,提供额定的性能操作,扩大指标对象的性能。代理模式的次要作用是扩大指标对象的性能,比如说在指标对象的某个办法执行前后你能够减少一些自定义的操作。动态代理动态代理中,咱们对指标对象的每个办法的加强都是手动实现的动态代理在编译时就将接口、实现类、代理类这些都变成了一个个理论的 class 文件。动态代理实现步骤:定义一个接口及其实现类;创立一个代理类同样实现这个接口将指标对象注入进代理类,而后在代理类的对应办法调用指标类中的对应办法。 3.动静代理从 JVM 角度来说,动静代理是在运行时动静生成类字节码,并加载到 JVM 中的。 3.1. JDK 动静代理机制JDK 动静代理类应用步骤定义一个接口及其实现类;自定义 InvocationHandler 并重写invoke办法,在 invoke 办法中咱们会调用原生办法(被代理类的办法)并自定义一些解决逻辑;通过 Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 办法创立代理对象; 3.2. CGLIB 动静代理机制Spring 中的 AOP 模块中:如果指标对象实现了接口,则默认采纳 JDK 动静代理,否则采纳 CGLIB 动静代理。 CGLIB 动静代理类应用步骤定义一个类;自定义 MethodInterceptor 并重写 intercept 办法,intercept 用于拦挡加强被代理类的办法,和 JDK 动静代理中的 invoke 办法相似;通过 Enhancer 类的 create()创立代理类; 3.3. JDK 动静代理和 CGLIB 动静代理比照JDK 动静代理只能只能代理实现了接口的类或者间接代理接口,而 CGLIB 能够代理未实现任何接口的类。 另外, CGLIB 动静代理是通过生成一个被代理类的子类来拦挡被代理类的办法调用,因而不能代理申明为 final 类型的类和办法。 动态代理和动静代理的比照灵活性 :动静代理更加灵便,不须要必须实现接口,能够间接代理实现类,并且能够不须要针对每个指标类都创立一个代理类。另外,动态代理中,接口一旦新减少办法,指标对象和代理对象都要进行批改,这是十分麻烦的!JVM 层面 :动态代理在编译时就将接口、实现类、代理类这些都变成了一个个理论的 class 文件。而动静代理是在运行时动静生成类字节码,并加载到 JVM 中的。

June 2, 2021 · 1 min · jiezi