代理设计模式(Proxy)主要为其他对象提供一种代理方式以控制对这个对象的访问,在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
其实代理说白一点就是真实对象的代表,在访问对象时引入一定程度的间接性,因为这些间接性可以附加多种用途。代理模式可分为静态代理和动态代理。
1.静态代理模式
为了更形象的说明代理模式,使用相亲来进行举例。相亲中的媒婆就好比代理对象,需要媒婆从中协调和美言几句,而当事人就是被代理对象了。
首先要把事件主题抽象成接口,这里相亲当然就是主题了,定义相亲接口blind
interface blind{ //定义相亲接口 public void blinding(); }
定义被代理对象(Person)
//被代理对象 class Man implements blind { public String name; public Man(String name) { this.name=name; } @Override public void blinding() { System.out.println(name+" 正在相亲中。。。。。"); } }
定义代理对象(媒婆)
//代理对象 class matchmaker implements blind{ private Man man;//被代理的对象需要确定 public matchmaker(Man man) { this.man=man; } //相亲前 public void before() { System.out.println("帮被代理对象美言几句。。。。"); } //相亲后 public void after() { System.out.println("相亲成功。。。。。。。"); } //相亲 @Override public void blinding() { //相亲前 before(); man.blinding(); //相亲后 after(); } }
代理模式使用
public static void main(String[] args) { Man man=new Man("小明"); //创建代理对象 matchmaker ok=new matchmaker(man); ok.blinding(); }
运行结果
静态代理模式需要真实角色必须是事先已经存在的,并将其作为代理对象内部属性。这样在实际使用时,一个真实角色必须对应一个代理角色,会导致类的急剧膨胀。
2.动态代理模式
静态代理模式里面被代理的类型需要提前确定,一个真实角色必须对应一个代理类,而然每个代理类只是里面的被代理对象不一样而已。
使用动态代理可以解决这个问题,使用java反射机制来解决被代理对象的类型确定。
动态代理实现代码
package com.longpo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyProxy { public static void main(String[] args) { Man man = new Man("小明"); InvocationHandler handler = new matchmaker(man); Class<?> classType = handler.getClass(); //使用反射生成代理对象 blind ok = (blind)Proxy.newProxyInstance(classType.getClassLoader(),man.getClass().getInterfaces(),handler); ok.blinding(); } } interface blind{ //定义相亲接口 public void blinding(); } //被代理对象 class Man implements blind { public String name; public Man(String name) { this.name=name; } @Override public void blinding() { System.out.println(name+" 正在相亲中。。。。。"); } } //代理对象 class matchmaker implements InvocationHandler{ private Object object;//被代理的对象不确定 public matchmaker(Object object) { this.object=object; } //相亲前 public void before() { System.out.println("帮被代理对象美言几句。。。。"); } //相亲后 public void after() { System.out.println("相亲成功。。。。。。。"); } //相亲 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //相亲前 before(); //相亲中 method.invoke(object, args); //相亲后 after(); return null; } }
运行结果:
通过这种方式,被代理的对象可以在运行时动态改变,需要控制的接口可以在运行时改变,控制的方式也可以动态改变,从而实现了非常灵活的动态代理关系。
相关推荐
动态代理设计模式是一种在运行时创建对象代理的技术,它允许我们为现有的对象提供额外的功能,而无需修改原对象的代码。这种模式的核心是接口和代理类,通过接口,代理类可以与原对象进行通信,同时在代理类中添加...
动态代理设计模式是一种编程技术,它允许在运行时创建具有相同接口的新对象,该对象能够对原对象的行为进行增强或扩展。在这个模式中,代理对象作为客户端与目标对象之间的中介,代理可以添加额外的功能,如日志记录...
详细而又简单的讲述了java动态代理设计模式
代理设计模式是其中的一种,它的主要作用是在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
代理设计模式是软件开发中的一个核心概念,尤其在iOS开发中扮演着重要角色。它允许在对象之间创建一种代理关系,使得代理对象可以代表原始对象执行某些操作,从而增加了系统的灵活性和可扩展性。在iOS开发中,代理...
代理设计模式是软件工程中的一种经典设计模式,它在对象之间提供了一种替代接口,使得客户端可以通过这个代理访问目标对象,而无需直接与目标对象交互。这样可以实现一些额外的功能,比如控制访问、增加安全性、数据...
代理设计模式是软件开发中的一种重要模式,它允许我们在不修改原有对象的基础上,通过代理对象对原对象进行增强或控制。本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种...
01.装饰者设计模式和动态代理设计模式.wmv
该系统是一款基于Java和HTML的MVC架构与代理设计模式的人员管理系统源码,包含79个文件,其中包括27个Java源文件、12个JSP页面、5个TLD文件以及相应的HTML、XML、Markdown等配置和说明文件。该系统采用分层设计,...
组成: ...代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
Java动态代理设计模式中融入抗疫元素的课程思政教学
动态代理是一种设计模式,它允许在运行时为对象创建代理,并在代理对象上执行方法调用。代理对象可以拦截对真实对象的访问,并允许在调用前后插入附加逻辑。这种设计模式可以用于横切关注点的集中处理,如日志记录、...
代理模式
其中,Java中的代理设计模式和工厂设计模式是两种非常重要的设计模式。 1. **单例设计模式**: 单例设计模式是23种设计模式中最简单的一种。它保证一个类只有一个实例,并提供一个全局访问点。这种方式适用于那些...
代理模式是一种常用的设计模式,它在软件开发中扮演着重要的角色,特别是在iOS平台的应用程序设计中。代理模式的核心思想是为一个对象提供一个替身或代理,以控制对这个对象的访问。这种模式允许我们通过代理来间接...
18. **代理设计模式**:为其他对象提供一种代理以控制对这个对象的访问。 19. **工厂方法设计模式**:定义一个创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 20. **适配器...
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 结构: 由三部分组成 1.RealSubject(真实对象): 真正会调用到的对象 2.Proxy(代理对象): 代理真实对象的地方 3.Subject(共同点): 代理对象...