基本介绍
- 代理模式:为一个对象 提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的 好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
- 被代理的对象可以是 远程对象、 创建开销大的对象或 需要安全控制 的 对象。
- 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK 代理、接口代理 Cglib代理) 。
- 代理模式示意图
静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类。
静态代理优缺点:
-
优点:在不修改目标对象的功能前提下, 能通过代理对象对目标功能扩展
-
缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类。一旦接口增加方法,目标对象和代理对象都会实现接口的方法,所以会增加维护的麻烦
静态代理案例分析
例如有个老师(定义为TeacherDAO)今天有事不能上课,那么就会让;另外一个老师(定义为TeacherDAO)来代课,那么有事老师就是目标对象,而代课老师就是代理对象。无论代理对象还是目标对象都是实现一个顶层接口或者继承一个父类,在这个例子TeacherDAO和TeacherDAO都要实现接口ITeacherDao,类图如下
特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法。
具体代码如下:
先写ITeacher接口类,定义一个teach方法
public interface ITeacherDAO {
void teach();
}
接下来编写代理类和被代理(目标)类
public class TeacherDAO implements ITeacherDAO {
@Override
public void teach() {
System.out.println("老师上课中");
}
}
public class TeacherDAOProxy implements ITeacherDAO {
private ITeacherDAO target;//目标对象,通过接口聚合
public TeacherDAOProxy(ITeacherDAO target) {
this.target = target;
}
@Override
public void teach() {
System.out.println("代理开始");
target.teach();
System.out.println("提交");
}
}
最后用客户端调用代理对象就可以了
public class Client {
public static void main(String[] args) {
TeacherDAO teacherDAO = new TeacherDAO();//被代理对象
TeacherDAOProxy teacherDAOProxy = new TeacherDAOProxy(teacherDAO);//创建代理对象,同时将被代理对象传递给代理对象
teacherDAOProxy.teach();
}
}
结果: