代理模式
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。(参见文献1)
以下以《Java与模式》中的示例为例:
抽象角色:
abstract public class Subject
{
abstract public void request();
}
真实角色:实现了Subject的request()方法。
public class RealSubject extends Subject
{
public RealSubject()
{
}
public void request()
{
System.out.println("From real subject.");
}
}
代理角色:
public class ProxySubject extends Subject
{
private RealSubject realSubject; //以真实角色作为代理角色的属性
public ProxySubject()
{
}
public void request() //该方法封装了真实对象的request方法
{
preRequest();
if( realSubject == null )
{
realSubject = new RealSubject();
}
realSubject.request(); //此处执行真实对象的request方法
postRequest();
}
private void preRequest()
{
//something you want to do before requesting
}
private void postRequest()
{
//something you want to do after requesting
}
}
客户端调用:
Subject sub=new ProxySubject();
Sub.request();
由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
2.动态代理类
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, J2EEjava语言JDK1.4APIjavalangObject.html">Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。
(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:
Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。(参见文献3)
在使用动态代理类时,我们必须实现InvocationHandler接口,以第一节中的示例为例:
抽象角色(之前是抽象类,此处应改为接口):
public interface Subject
{
abstract public void request();
}
具体角色RealSubject:同上;
代理角色:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;
public class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject() {
}
public DynamicSubject(Object obj) {
sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before calling " + method);
method.invoke(sub,args);
System.out.println("after calling " + method);
return null;
}
}
该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;此外,在该类还实现了invoke方法,该方法中的
method.invoke(sub,args);
其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,args为执行被代理对象相应操作所需的参数。通过动态代理类,我们可以在调用之前或之后执行一些相关操作。
客户端:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Client
{
static public void main(String[] args) throws Throwable
{
RealSubject rs = new RealSubject(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs); //初始化代理类
Class cls = rs.getClass();
//以下是分解步骤
/*
Class c = Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces()) ;
Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
Subject subject =(Subject) ct.newInstance(new Object[]{ds});
*/
//以下是一次性生成
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(),ds );
subject.request();
}
通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变,控制的方式(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系(参见文献2)。
参考文献:
1. 阎宏,《Java 与模式》
2. 透明,《动态代理的前世今生》
3. Forest Hou,《Dynamic Proxy 在 Java RMI 中的应用》
发表评论
-
深入分析 Java 中的中文编码问题
2011-11-16 07:45 0几种常见的编码格式 ... -
Java 编码
2011-11-16 07:44 0http://zhidao.baidu.com/quest ... -
java字符编码原理解析
2011-11-16 07:43 0可以理解为计算机没 ... -
HttpClient
2011-11-03 11:07 836From http://www.blogjava.net/Al ... -
ECLIPSE ANT OutOfMemoryError
2011-08-04 17:23 1018ANT BUILD MEMORY ERROR: [cl ... -
JDBC BATCH
2011-07-05 14:58 0PreparedStatement ps = conn.pre ... -
OUT OF MEMORY WHEN BUILD
2011-02-22 17:47 01, ANT BUILD: In Eclipse op ... -
spring weblogic jndi
2011-02-16 09:18 1844weblogic:weblogic8.1 数据库:MySql ... -
log4j 邮件
2011-01-24 15:54 0<!-- 设置上下文参数 --> ... -
tomcat weblogic
2010-12-01 11:25 1868EJB 层基本搞定,以前测试 EJB 也都是写一个 appli ... -
ant weblogic “local class incompatible: stream classdesc serialVersionUI”
2010-11-29 12:41 2239weblogic.management.Management ... -
Debugging with the Maven Jetty Plugin in Eclipse
2010-11-15 17:42 1043debug: http://docs.codehaus.or ... -
maven tomcat eclipse debug
2010-11-15 17:36 1956from: http://bandaidprogrammin ... -
maven app tomcat 部署
2010-11-11 15:56 1312修改pom.xml,添加如下配置: <build ... -
Maven Cargo Tomcat 部署
2010-11-11 15:49 1774pom.xml中<build>下添加如下代码: ... -
java中读取配置文件各种方法
2010-09-07 12:31 01。使用Java.util.Properties类的load( ... -
ThreadGroup
2010-05-25 08:47 0在Java中每个线程都属于某个线程组(ThreadGroup) ... -
java Excel 导出
2010-03-28 20:06 0public void createExcel(OutputS ... -
java小数保留两位小数
2009-11-19 16:49 2341方式一: 四舍五入 double f = ... -
java中实现xml schema 验证文件
2009-11-16 20:05 3884XML 是可扩展标记语言,也就是说其中的标记我们可以按照我们 ...
相关推荐
## 01、数据介绍 动态能力理论最早由提斯(Teece)与皮萨洛(Pisano)于1994年正式提出,他们将动态能力定义为“能够创造新产品和新过程,以及对变化的市场环境做出响应的一系列能力”。 动态能力具体体现在吸收能力、创新能力和适应能力三个方面。这些能力使公司能够快速适应市场变化,抓住新的商业机会,从而保持或提升竞争优势。 数据名称:上市公司-动态能力数据 数据年份:2012-2023年 ## 02、相关数据及指标 证券代码 证券名称 年份 Symbol RD IA ACV DC
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用
随机配置网络模型SCN多输入单输出拟合预测建模与效果评估图集展示,随机配置网络模型SCN多输入单输出拟合预测建模工具——直观输出预测图与评价报告,随机配置网络模型SCN做多输入单输出的拟合预测建模。 程序内注释详细直接替数据就可以使用。 程序语言为matlab。 程序直接运行可以出拟合预测图,迭代优化图,线性拟合预测图,多个预测评价指标。 PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。 2.由于每个人的数据都是独一无二的,因此无法做到可以任何人的数据直接替就可以得到自己满意的效果。 ,核心关键词: 随机配置网络模型SCN; 多输入单输出拟合预测建模; 程序内注释; MATLAB程序; 拟合预测图; 迭代优化图; 线性拟合预测图; 预测评价指标。,Matlab下的多输入单输出网络模型预测建模及评价指标体系构建
主应力方向破坏:深入解析comsol水力压裂的力学机制,comsol技术解析:水力压裂主应力方向与岩层破坏之探究,comsol水力压裂,主应力方向的破坏 ,comsol水力压裂; 主应力方向; 破坏; 裂缝扩展。,水力压裂主应力破坏研究
基于碳捕集电厂低碳特性的多时间尺度综合能源系统调度模型与优化算法研究,基于碳捕集电厂低碳特性与综合能源系统的多时间尺度电热调度模型。,计及碳捕集电厂低碳特性 需求响应 综合能源系统 多时间尺度调度模型 MATLAB代码: 关键词:碳捕集电厂 综合灵活运行方式 需求响应 日前调度 实时调度 参考文档:《计及碳捕集电厂低碳特性的含风电电力系统源-荷多时间尺度调度方法》非完全复现,只做了日前日内部分,并在上述基础上改进升级为电热综合电源系统 仿真平台:MATLAB yalmip+cplex 主要内容:代码主要做的是一个电厂 微网多时间尺度电热综合能源系统低碳经济调度模型,源侧在碳捕集电厂中装设烟气旁路系统与溶液存储器,形成碳捕集电厂综合灵活运行方式进而与风电协调配合;荷侧调用不同响应速度的价格型、激励型需求响应资源克服多时间尺度下碳捕集电厂综合灵活运行方式的局限,通过源荷资源协调优化,从而提高系统的低碳性能。 其次,构建源荷协调的日前-日内两阶段低碳经济调度模型,优化系统的负荷及分配计划。 ,关键词:碳捕集电厂; 综合灵活运行方式; 需求响应; 日前调度; 实时调
chromedriver-mac-arm64-135.0.7031.0(Canary).zip
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用
1. 网上商城系统 这是一个基于python+vue开发的商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括:首页、商品详情页、用户中心模块。 后台功能包括:总览、订单管理、商品管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。
MATLAB环境下基于振动信号的旋转机械状态监测与预测算法研究与应用拓展,MATLAB环境下基于振动信号的旋转机械状态监测与预测算法研究与应用拓展,MATLAB环境下使用振动信号对旋转机械进行状态监测和预测。 算法运行环境为MATLAB r2021b,从滚动轴承的振动信号中提取特征、进行状态监测和预测。 算法可迁移至金融时间序列,地震 微震信号,机械振动信号,声发射信号,电压 电流信号,语音信号,声信号,生理信号(ECG,EEG,EMG)等一维时间序列信号。 ,MATLAB环境; 振动信号; 旋转机械状态监测与预测; 滚动轴承; 特征提取; 一维时间序列信号。,MATLAB算法:一维时间序列振动信号的旋转机械状态监测与预测
@property 是 Python 中的装饰器,用于将方法转换为属性,使得访问属性时无需调用方法。它让代码更加简洁、优雅,同时保持封装性,提升代码的可读性和维护性。
springboot企业数据管理平台类社会服务平台源码+论文+视频1
智慧社区,作为智慧城市的重要组成部分,正逐步改变着我们的生活方式。近年来,随着国家政策的不断推动,智慧社区建设进入了快速发展阶段。2014年,国务院发布的《关于促进智慧城市健康发展的指导意见》为智慧城市建设指明了方向,而随后的《关于加强和完善城乡社区治理的意见》及《绿色社区创建行动方案》等文件,进一步加速了智慧社区的建设步伐。据预测,2020年智慧社区市场规模已突破6000亿元,展现出巨大的市场潜力和发展空间。 智慧社区的建设,主要依赖于物联网、云计算、大数据等先进技术的融合应用。这些技术不仅提升了社区的安全保障、应急响应和设备监管能力,还实现了社区管理的智能化和高效化。通过物联网技术,智慧社区能够实时监测社区内的各项设施,如智慧照明、水泵房监测、配电监测等,确保社区运行的安全和稳定。同时,借助云计算和大数据技术,智慧社区可以整合各类传感器资源,为社区提供统一的云计算和大数据服务,构建“云+端”的立体化服务体系。这种服务模式不仅提高了社区管理的效率,还为居民带来了更加便捷、舒适的生活体验。 在智慧社区中,各种创新应用层出不穷。例如,智慧安防系统可以实时监测井盖异动、应急通道违停等情况,确保社区的安全;智慧环境监测系统则能够实时监测垃圾桶满溢、天气情况等信息,为社区的环保和卫生工作提供有力支持。此外,智慧社区还通过数据分析与挖掘技术,针对不同人、物、事、场景进行深层次分析,助力全面管控与优化系统与监管机制。这些创新应用不仅提升了社区的管理水平,还为居民创造了一个更加绿色、健康、安全、舒适、低碳、便捷的生活环境。随着技术的不断进步和应用场景的不断拓展,智慧社区的未来将更加美好,为城市居民带来更加智能、便捷的生活方式。
cart,cd3, c4.5 决策树代码和可视化,数据,完整资源
双有源桥扩展技术:100kHz高频率、最小电流应力优化的3kw功率开关控制系统,双有源桥扩展技术:100kHz高频率、375-48V宽电压范围下的3kw功率控制与优化,双有源桥扩展移相控制 开关频率100k,375-48V,功率3kw 控制方式为最小电流应力优化控制 参数可定制 ,双有源桥;扩展移相控制;开关频率100k;功率3kw;最小电流应力优化控制;参数可定制,双桥移相控制,最小电流应力优化——100k开关频率功率控制技术
## 01、数据简介 出口退税率是针对出口产品在国内已缴纳的税款,在货物报关出口后退还给出口企业时,按照一定比例计算的退税金额与计税价格之间的比率。 出口退税率是出口退税制度中的一个重要参数,它体现了国家对出口企业的税收优惠政策,有助于降低企业的出口成本,提升其在国际市场上的竞争力。同时,国家也会根据经济形势和国际贸易的变化,适时调整出口退税率,以更好地服务于国家的经济发展战略。 数据名称:2024年HS编码出口退税率数据 数据年份:2004-2024年 ## 02、相关数据 CODE、ST_DATE、END_DATE、ZHCMCODE、NAME、DWCODE、UNIT、BCFLAG、STDFLAG、DWFLAG、SZ、ZSSL_SET、CLDE、CJDL、TSL、SPLB、TSFLAG、NOTE。 ## 03、数据截图
最近比较火的虎年西游记金钱豹头像制作小程序源码 今天为大家分享一下最近抖音和朋友圈比较火的云开发虎年西游记金钱豹头像制作小程序源码和西游记南山大王金钱豹的趣味头像素材包,年少不知豹哥好,错把樵哥当成宝,金钱豹头像最近也是由于谐音梗金钱暴富为大家所知晓,加上短视频和朋友圈的推波助澜下,成功让这个人物火出了圈,由此也诞生了金钱豹头像制作小程序和网站,今天先给大家分享一下小程序的源码,还是虎年风格的金钱豹头像制作小程序源码,加上浓浓的新年氛围,金钱豹头像喜庆边框,简约可爱,内置十八个金钱豹头像素材,选中金钱豹头像和边框点击保存就可以去换头像啦。
PNP发射极接地开关仿真原理图
风电-光热-生物质混合电站鲁棒优化调度模型:最大化利润与应对不确定性的策略,风电-光热-生物质混合电站的鲁棒优化调度模型:最大化利润并平衡不确定性风险,风电-光热-生物质混合电站鲁棒优化调度模型 摘要:为解决混合电站参与电力市场运行问题,从混合电站的结构及运行机理出发,提出了电力市场下风电-光热-生物质混合电站鲁棒优化调度模型。 该模型以最大化运行利润为目标函数,考虑了混合电站参与电力市场所获收益、并网运行环境效益、弃风弃光惩罚成本、各组成部分运行维护成本、系统运行约束等因素。 针对混合电站运行面临的不确定性和由此带来的风险问题,采用鲁棒优化方法处理风电功率、光热功率、负荷及电力市场价格的不确定性,并建立风险量化指标,平衡系统的鲁棒性与经济性,为混合电站运营商提供决策依据。 本代码为参考文献而原创代码 ,核心关键词:混合电站; 鲁棒优化; 调度模型; 电力市场; 运行利润; 不确定性; 风险量化; 风电-光热-生物质,电力市场下混合能源电站鲁棒优化调度模型研究
springboot在线知识管理平台类智慧交通调度平台源码+论文+视频1