一、代理的概念:
定义:为其他对象提供一种代理,以控制对这个对象的访问。
关于Java中的代理,有一种常用的设计模式---代理模式;对于代理,根据创建代理类的时间点的不同,又可以分为:静态代理和动态代理。
代理模式,是一种常用的Java设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单地说,在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性可以附加多种用途,在实际开发中这种间接性会带来很多的便捷。
二、代理的作用:
1. 远程代理:为位于两个不同地址空间对象的访问提供一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。
2. 虚拟代理:通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。
3. 缓冲代理:为某个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。
4. 保护代理:可以控制对一个对象的访问权限,为不同的用户提供不同级别的使用权限。
5. 智能引用:要为一个对象的访问(引用)提供一些额外的操作时可以使用。
三、静态代理:指预先确定了代理者与被代理者的关系,在编译期间就确定了代理类与被代理类之间的依赖关系。
静态代理,由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口、被代理类、代理类等确定下来。在程序运行之前,代理类的 .class 文件就已经生成。
代理模式最主要的就是有一个公共接口、一个具体的类、一个代理类,代理类持有具体类的实例,代为执行具体类实例方法。上面说到,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。这里的间接性就是指不直接调用实际对象的方法,那么我们在代理过程中就可以加上一些其他的用途。
/**
* 共用接口
*/
public interface Person {
public void working(String work); // 工作
public void goOutMethod(String method); // 出行方式
}
/**
* 学生类
*/
public class Student implements Person {
@Override
public void working(String work) {
// TODO Auto-generated method stub
System.out.println("工作内容是:"+work);
}
@Override
public void goOutMethod(String method) {
// TODO Auto-generated method stub
System.out.println("出行方式是:"+method);
}
}
/**
* 老师类
*/
public class Teacher implements Person {
@Override
public void working(String work) {
// TODO Auto-generated method stub
System.out.println("工作内容是:"+work);
}
@Override
public void goOutMethod(String method) {
// TODO Auto-generated method stub
System.out.println("工作内容是:"+method);
}
}
/**
* 代理类
*/
public class ProxyClass implements Person {
Person person; //要代理的对象
// 代理类构造方法
public ProxyClass(Person per) {
this.person = per;
}
@Override
public void working(String work) {
// TODO Auto-generated method stub
person.working(work);
}
@Override
public void goOutMethod(String method) {
// TODO Auto-generated method stub
person.goOutMethod(method);
}
}
/**
* 创建代理对象的静态代理工厂类
*/
public class ProxyFactory {
public static Person getProxyStudent(){
return new ProxyClass(new Student());
}
public static Person getProxyTeacher(){
return new ProxyClass(new Teacher());
}
}
/**
* 创建静态代理类实际的调用类
*/
public class MainClass {
public static void main(String[] args) {
System.out.println("=================================");
ProxyFactory.getProxyStudent().goOutMethod("坐