委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
“委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!代码如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* @author Liusheng
* 实现“委托”模式,用户需要实现InvocationHandler接口;
* 参考:http://www.uml.org.cn/j2ee/200411036.htm
*/
public abstract class Delegator implements InvocationHandler {
//RelegateTo针对每个对象都要生成一个实例,因而非Static的log,代价比较高。
//protected Log _log = LogFactory.getLog(this.getClass());
//private static Log _log = LogFactory.getLog(RelegateTo.class);
//--------------------------------------------
protected Object obj_orgin = null; //原始对象
protected Object obj_proxy = null; //代理对象
//--------------------------------------------
public Delegator() {
//空
}
public Delegator(Object orgin){
this.createProxy(orgin);
}
//--------------------------------------------
protected Object createProxy(Object orgin) {
obj_orgin = orgin;
obj_proxy = Proxy.newProxyInstance(
orgin.getClass().getClassLoader(), //加载器
orgin.getClass().getInterfaces(), //接口集
this); //委托
//_log.debug("# 委托代理:"+obj_proxy);
return obj_proxy;
}
protected Object invokeSuper(Method method, Object[] args)
throws Throwable {
return method.invoke(obj_orgin, args);
}
//--------------实现InvocationHandler接口,要求覆盖------------
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
// 缺省实现:委托给obj_orgin完成对应的操作
if (method.getName().equals("toString")) { //对其做额外处理
return this.invokeSuper(method, args)+"$Proxy";
}else { //注意,调用原始对象的方法,而不是代理的(obj==obj_proxy)
return this.invokeSuper(method, args);
}
}
}
下面的代码,则是作为一个委托的例子,实现Map的功能。
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bs2.core.UtilLog;
/**
* @author Liusheng
* 本代码主要用于演示RelegateTo的使用方法
*/
public class Delegator4Map extends Delegator {
private static Log _log = LogFactory.getLog(Delegator4Map.class);
private Map orginClass = null; //原始对象
private Map proxyClass = null; //代理对象
public Map getOrgin() { return orginClass; }
public Map getProxy() { return proxyClass; }
public Delegator4Map(Map orgin) {
super(orgin);
orginClass = orgin;
proxyClass = (Map)super.obj_proxy;
}
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
if (method.getName().equals("size")) { //修改close处理逻辑
_log.debug("原始 size()="+super.invoke(obj, method, args));
Object res2 = new Integer(-1);
_log.debug("修改 size()="+res2);
return res2;
}else {
return super.invoke(obj, method, args);
}
}
public static void main(String[] args) throws IOException {
UtilLog.configureClassPath("resources/log4j.properties", false);
Delegator4Map rtm = new Delegator4Map(new Hashtable());
Map m = rtm.getProxy();
m.size();
_log.debug("代理:"+m.toString());
}
}
分享到:
相关推荐
本教程介绍了 Rust 的基础语法、所有权模型、函数与模块设计,以及高级特性(如错误处理、闭包和并发编程)。通过提供实用的练习和答案,帮助您快速掌握 Rust 的核心概念,为系统级编程打下扎实基础。
基于springboot+Web的毕业设计选题系统源码数据库文档.zip
# 基于Spring和MyBatis的疫情防控管理系统 ## 项目简介 本项目是一个基于Spring和MyBatis框架的疫情防控管理系统,旨在实现数据在管理员、医务人员、患者和数据上报者之间的流转。系统涵盖了用户登录、注册、信息管理、预约管理、检测结果管理等功能,支持多角色的权限管理和数据操作。 ## 项目的主要特性和功能 1. 用户管理 用户登录、注册和登出功能。 用户个人信息管理,包括核酸检测记录和预约记录。 2. 管理员管理 管理员列表管理,支持增删改查操作。 医院信息管理,支持增删改查操作。 3. 医务人员管理 核酸预约和疫苗接种预约管理。 核酸检测结果和疫苗接种结果管理。 患者信息管理。 4. 数据上报者管理 风险区域数据上报。 患者信息上报。 5. 系统安全 通过拦截器实现用户登录状态检查,未登录用户将被重定向到登录页面。
对数据集进行二分类,有数据集和源码以及模型,二分类是识别猫和不是猫的情况,可做毕业设计。
最新完美版积分商城系统,网购商城系统源码,是更新的奇偶商城系统源码, 它拥有独立代理后台,而且内附搭建教程。 企业猫搭建了下,感觉这个源码很新颖的,购买商品后可以选择直接发货还是拆红包升级购买的商品升级成别的商品。
编译好的Linux版网络调试助手,方便直接使用,免得每次都需要重新编译
office使用软件
# 基于Python和Flask的博客管理系统 ## 项目简介 本项目是一个基于Python和Flask框架的博客管理系统,旨在为用户提供一个简单易用的博客平台。用户可以注册、登录、发布博客、管理博客内容以及评论等功能。 ## 项目的主要特性和功能 1. 用户管理 用户注册和登录功能。 用户个人信息管理。 2. 博客管理 发布、编辑和删除博客文章。 博客分类和标签管理。 3. 评论系统 用户可以对博客文章进行评论。 评论的查看和管理。 4. 权限管理 管理员可以管理用户和博客内容。 普通用户只能管理自己的博客和评论。 ## 安装使用步骤 1. 环境准备 确保已安装Python 3.x。 安装Flask框架pip install Flask。 2. 数据库配置 在config.py文件中配置数据库连接信息。
基于springboot+vue的实践性教学系统源码数据库文档.zip
基于springboot二手物品交易系统源码数据库文档.zip
基于springboot餐品美食论坛源码数据库文档.zip
人工智能开发项目深度学习项目源码带指导视频词云提取方式是百度网盘分享地址
基于springboot企业员工薪酬管理系统源码数据库文档.zip
基于springboot+JavaWeb图书管理系统源码数据库文档.zip
数据库设计管理课程设计系统设计报告(powerdesign+sql+DreamweaverCS)销售管理系统设计与开发提取方式是百度网盘分享地址
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
基于springboot的小说阅读平台源码数据库文档.zip
# 基于PaddleDetection框架的人流量统计系统 ## 项目简介 本项目是一个基于PaddleDetection框架的人流量统计系统,专注于静态和动态场景下的人员计数和行人检测。项目涵盖了从数据准备、模型选择、训练、评估、优化到预测和部署的完整流程,旨在提供高效、准确的人流量统计解决方案。 ## 主要特性和功能 多模型支持支持多种模型选择,如DeepSORT、JDE和FairMOT,适用于多目标追踪场景。 模型优化提供多种优化策略,包括数据增强、可变形卷积、syncbn+ema、attention和GIoU Loss,以提升模型精度。 性能加速支持TensorRT推理加速,显著提升模型性能。 数据增强提供多种数据增强方式,如cutmix、syncbn和ema,进一步优化模型性能。 模型导出支持模型导出,便于模型部署和上线。 ## 安装使用步骤 1. 安装PaddleDetection框架 bash
基于springboot的银行信用卡额度管理系统源码数据库文档.zip
# 基于Arduino的蒸发冷却系统 ## 项目简介 本项目旨在创建一个蒸发冷却系统(即沼泽冷却器),这是一种在干燥炎热气候下提供能源效率替代空调的系统。该系统使用Arduino 2560和各种传感器来监控和控制冷却过程。 ## 项目的主要特性和功能 水位监控通过水位传感器监控水箱中的水位,并在水位过低时发出警报。 温度和湿度显示在LCD屏幕上显示空气温度和湿度。 风扇控制根据温度范围控制风扇电机。 系统开关通过用户按钮控制系统的开关。 日志记录记录电机激活和停用的时间和日期。 ## 安装使用步骤 2. 硬件连接按照项目文档中的电路图连接所有硬件组件,包括水位传感器、LCD显示屏、实时时钟模块、DHT11传感器和风扇电机。 3. 上传代码将下载的代码上传到Arduino 2560开发板。 4. 启动系统通过用户按钮启动系统,观察LCD屏幕上的温度和湿度显示,并监控水位传感器的状态。