码迷,mamicode.com
首页 > 编程语言 > 详细

java的静态代理和动态代理(jdk、cglib)

时间:2016-08-28 17:54:44      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

一、代理模式

代理的概念来自于设计模式中的代理模式,先了解一下代理模式

1、结构图

技术分享

2、参与者

Subject:接口,定义代理类和实际类的共用接口

RealSubject:实际类,实现Subject这个接口

Proxy:代理类,实现Subject这个接口,内部引用一个RealSubject实际类

3、描述

Proxy实现了Subject接口,内部引用一个RealSubject实际类,RealSubject能做的Proxy都会

于是Proxy代替了RealSubject,实例化到Subject里交给客户端调用,而客户端不知道自己实际用的是谁

客户端调用了Subject接口中的Request()方法,实际上访问的是Proxy

Proxy类提供了一个客户端对RealSubject的间接性访问的过程,在这个过程中可以做很多的控制

4、意图

控制对象的访问

5、应用场景

虚代理:根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建

远程代理:用来在不同的地址空间上代表同一个对象,这个不同的地址空间可以是在本机,也可以在其他机器上,在java里面最典型的就是RMI技术

copy-on-write代理:在客户端操作的时候,只有对象确实改变了,才会真的拷贝(或克隆)一个目标对象,算是虚代理的一个分支

保护代理:控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问

Cache代理:为那些昂贵操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果

防火墙代理:保护对象不被恶意用户访问和操作

同步代理:使多个用户能够同时访问目标对象而没有冲突

 

二、静态代理

java中的静态代理就是代理模式最简单的实现,下面是示例代码:

//接口
public interface Subject {
	void Request();
}

//实际类
public class RealSubject implements Subject {
	public void Request() {
		System.out.println("执行具体的功能");
	}
}

//代理类
public class Proxy implements Subject {
	private Subject realSubject = null;

	public Proxy(Subject subject) {
		realSubject = subject;
	}

	public void Request() {
		System.out.println("静态代理开始");
		realSubject.Request();
		System.out.println("静态代理结束");
	}
}

//客户端
public class Client {
	public static void main(String[] args) {
		RealSubject realSubject = new RealSubject();
		realSubject.Request();
		
		Subject subject = new Proxy(realSubject);
		subject.Request();
	}
}

 

java的静态代理和动态代理(jdk、cglib)

标签:

原文地址:http://www.cnblogs.com/ctxsdhy/p/5815492.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!