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

详解代理模式的根本构造和原理代理模式是一种罕用的设计模式,它为其余对象提供了一个代理,以管制对这个对象的拜访。代理模式能够用来限度拜访、实现近程拜访、提早加载等性能。在本文中,咱们将具体介绍代理模式的根本构造和原理,并通过一个例子来阐明代理模式的利用。 根本构造代理模式由三局部组成:形象主题(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

结构型模式代理模式

文章首发:结构型模式:代理模式 七大结构型模式之七:代理模式。简介姓名 :代理模式 英文名 :Proxy Pattern 价值观 :为生活加点料 个人介绍 :Provide a surrogate or placeholder for another object to control access to it.为其他对象提供一种代理以控制对这个对象的访问。(来自《设计模式之禅》) 你要的故事咱们从事 IT 行业,随时都可能上网查东西,如果网络速度慢或者网络访问受限制,那是相当的折磨,忍无可忍。而咱在国内网络比较特殊,有个墙围着,俗称防火长城。今天讲到代理模式,就来讲讲这道墙。这墙是这么实现的,我们上网,正常的网络是世界各地的网站我们都能访问,而加上这道墙,相当于在我们上网的时候做了一层代理,这一层代理把禁用的网站给过滤掉,使得我们没法访问被禁用的网站。下面通过代码来讲解。 定义一个互联网接口,里面有一个访问网站的通用方法 access。 /** * 互联网 */interface Internet { String access(String domain);}定义世界范围内的网络类,可以访问任何存在的网站。 /** * 世界网络 */class WorldNetwork implements Internet { @Override public String access(String domain) { System.out.println("访问网站:" + domain); return domain + "网站内容"; }}定义中国的网络类,就是代理类,实现墙的功能。disable 对象存储了在国内禁止访问的网站,用户在访问网站时(也就是调用 access 访问)先判断网站是不是在禁用的网站集合里面,如果是则禁用,如果不是则继续访问。 /** * 中国网络(就是代理) */class ChinnessNetwork implements Internet { private Set<String> disable; private Internet internet; public ChinnessNetwork(Internet internet) { this.internet = internet; this.disable = new HashSet<>(); this.disable.add("www.google.com"); this.disable.add("www.facebook.com"); } @Override public String access(String domain) { if (disable.contains(domain)) { System.out.println("禁止访问该网站:" + domain); return "禁止访问该网站:" + domain; } return internet.access(domain); }}测试代码,ChinnessNetwork 作为代理类,WorldNetwork 作为被代理类。 ...

May 15, 2019 · 1 min · jiezi

java-什么是动态代理

微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理,其中 Spring AOP 就是动态代理的典型例子。动态代理又分为接口代理和 cglib (子类代理),结合我的理解写了几个 demo 分享给你们,这是昨晚修仙到 3 点写出来的文章,不点在看,我觉得说不过去了。 代理模式在我们日常中很常见,生活处处有代理: 看张学友的演唱会很难抢票,可以找黄牛排队买嫌出去吃饭麻烦,可以叫外卖无论是黄牛、外卖骑手都得帮我们干活。但是他们不能一手包办(比如黄牛不能帮我吃饭),他们只能做我们不能或者不想做的事。 找黄牛可以帮我排队买上张学友的演唱会门票外卖骑手可以帮我把饭送到楼下所以,你看。代理模式其实就是当前对象不愿意做的事情,委托给别的对象做。 静态代理我还是以找黄牛帮我排队买张学友的演唱会门票的例子,写个 demo 说明。现在有一个 Human 接口,无论是我还是黄牛都实现了这个接口。 public interface Human { void eat(); void sleep(); void lookConcert();}例如,我这个类,我会吃饭和睡觉,如以下类: public class Me implements Human{ @Override public void eat() { System.out.println("eat emat ...."); } @Override public void sleep() { System.out.println("Go to bed at one o'clock in the morning"); } @Override public void lookConcert() { System.out.println("Listen to Jacky Cheung's Concert"); }}有黄牛类,例如: ...

May 12, 2019 · 4 min · jiezi

装饰器代理模式与Spring-AOP

引言翻开to-do,注解认证中答应大家要讲解代理模式。 正好遇到了一道这样的题:抛开Spring来说,如何自己实现Spring AOP? 就喜欢这样的题,能把那些天天写增删改查从来不思考的人给PK下去,今天就和大家一切学习代理模式与Spring AOP。 代理与装饰器场景描述代理,即替代之意,可替代所有功能,即和原类实现相同的规范。 代理模式和装饰器模式很像,之前的装饰器讲的不是很好,这里换个例子再讲一遍。 宁静的午后,来到咖啡馆,想喝一杯咖啡。基础实现给你一个咖啡接口: public interface Coffee { /** * 打印当前咖啡的原材料,即咖啡里有什么 */ void printMaterial();}一个默认的苦咖啡的实现: public class BitterCoffee implements Coffee { @Override public void printMaterial() { System.out.println("咖啡"); }}默认的点餐逻辑: public class Main { public static void main(String[] args) { Coffee coffee = new BitterCoffee(); coffee.printMaterial(); }}点一杯咖啡。 装饰器模式优雅的服务生把咖啡端了上来,抿了一口,有些苦。 想加点糖,对服务生说:“您好,请为我的咖啡加些糖”。 /** * 糖装饰器,用来给咖啡加糖 */public class SugarDecorator implements Coffee { /** * 持有的咖啡对象 */ private final Coffee coffee; public SugarDecorator(Coffee coffee) { this.coffee = coffee; } @Override public void printMaterial() { System.out.println("糖"); this.coffee.printMaterial(); }}然后服务生就拿走了我的咖啡,去使用SugarDecorator为咖啡加糖,最后把加好糖的咖啡给我。 ...

May 11, 2019 · 2 min · jiezi