重拾设计模式-代理模式

简介:
代理模式属于结构型模式,功能是为其他对象提供一种代理以便于控制对这个对象的访问。常见实现方式有静态代理、动态代理。Spring中的AOP就是基于代理模式实现的。

具体实现及测试如下:

1. 静态代理
/**
 * 定义功能接口,让代理和被代理对象进行实现
 * @author dedu
 *
 */
public interface ISubject {
	void request();
}
/**
 * 被代理者,进行实际的请求处理,并将结果返回给代理者
 * @author dedu
 *
 */
public class RealSubject implements ISubject {
	@Override
	public void request() {
		System.out.println("实际请求处理者进行处理");
	}
}
/**
 * 静态代理:代理中保存一个被代理者的引用,当代理被调用时,内部个性化处理完后调用被代理者相应函数
 * @author dedu
 *
 */
public class Proxy implements ISubject {
	
	private ISubject rs;

	public Proxy(ISubject rs) {
		super();
		this.rs = rs;
	}
	@Override
	public void request() {
		System.out.println("代理者进行请求接收");
		rs.request();
		System.out.println("代理者调用实际请求结束");
	}
}

测试

	public static void main(String[] args) {
		ISubject sub = new RealSubject();
		Proxy proxy = new Proxy(sub);
		proxy.request();
	}
2. 动态代理
/**
 * 定义功能接口,让代理和被代理对象进行实现
 * @author dedu
 *
 */
public interface ISubject {
	void request();
}
/**
 * 被代理者,进行实际的请求处理,并将结果返回给代理者
 * @author dedu
 *
 */
public class RealSubject implements ISubject {
	@Override
	public void request() {
		System.out.println("实际请求处理者进行处理");
	}
}
2.1 基于JDK实现
public class SubjectHandler implements InvocationHandler {

	private ISubject subject;
	
	public SubjectHandler(ISubject subject) {
		super();
		this.subject = subject;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("JDK代理者接收请求,调用被代理者进行处理");
		Object result = method.invoke(subject, args);
		/* if ("checkUserPower".equals(method.getName())) { //也可以针对某个方法进行个性化处理
			//其他处理
		} */
		System.out.println("JDK代理者接收处理结果,返回结果对象");
		return result;
	}
}
2.2 基于CGLib实现
/**
 * 基于cglib实现动态代理,Jar包为cglib-2.2.2、asm-3.3.1
 * @author dedu
 *
 */
public class SubjectInterceptor implements MethodInterceptor {

	private ISubject subject;
	
	public SubjectInterceptor(ISubject subject) {
		this.subject = subject;
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		System.out.println("CGLib代理者接收请求,调用被代理者进行处理");
		Object result = arg1.invoke(this.subject, arg2);
		/* if ("checkUserPower".equals(method.getName())) { //也可以针对某个方法进行个性化处理
			//其他处理
		} */
		System.out.println("CGLib代理者接收处理结果,返回结果对象");
		return result;
	}
	
	public Object createProxyInstance() {
		Enhancer eh = new Enhancer();
		eh.setSuperclass(this.subject.getClass());
		eh.setCallback(this);
		return eh.create();
	}
}

测试

public static void main(String[] args) {
		//JDK代理测试
		ISubject realSubject = new RealSubject();
		SubjectHandler handler = new SubjectHandler(realSubject);
		ISubject dynamicProxy = (ISubject) Proxy.newProxyInstance(ISubject.class.getClassLoader(), new Class[] {ISubject.class}, handler);
		dynamicProxy.request();
		
		//CGLib代理测试
		ISubject trueSubject = new RealSubject();
		SubjectInterceptor cglibProxy = new SubjectInterceptor(trueSubject);
		ISubject proxy = (ISubject) cglibProxy.createProxyInstance();
		proxy.request();
	}
3. 总结:
静态代理:在代理中保存一个引用使得代理可以访问实体并提供一个与实体相同的接口。
动态代理:是代理类在程序运行时创建,常见实现方式有JDK自带的动态代理类(利用反射机制生成子类)和CGLib动态代理类(利用ASM修改字节码生成子类)。
  1. JDK代理只能对实现了接口的类生成代理。
  2. CGLib可以直接对类进行代理生成,但要求类不是final,代理的方法不是final/static/private的。
内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值