一、代理模式
1、代理(Proxy)模式
为一个对象提供一个替身
,以控制对该对象的访问。即通过代理对象访问目标对象,好处是
:限制、增强或修改目标对象的功能。
2、被代理对象
可以是:远程对象
,创建开销大的对象
或者需要安全控制的对象
。
3、代理的不同形式
静态代理
,动态代理
(jdk代理 / 接口代理)、Cglib代理
(可以在内存动态的创建对象,而不需要实现接口,他是属于动态代理的范畴)。
4、示意图
二、静态代理
1、静态代理
静态代理在使用时,需要定义接口或者父类
,被代理的对象与代理对象
一起实现相同的接口或者继承相同父类。
2、应用实例
(1)定义一个接口:ITeacherDao
(2)目标对象TeacherDao实现接口ITeacherDao
(3)使用静态代理方式,就需要在代理对象TeacherDaoProxy中也实现ITeacherDao。
(4)调用的时候通过调用代理对象的方法来调用代理对象(目标)。
(5)特别提醒:
代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用代理(目标)对象的方法。
3、代码实现
//接口
public interface ITeacherDao {
//授课的方法
void show();
}
public class TeacherDao implements ITeacherDao{
@Override
public void show() {
System.out.println("老师授课中·····");
}
}
//代理对象,静态代理
public class TeacherDaoProxy implements ITeacherDao{
private ITeacherDao target;//目标对象,通过接口来聚合
public TeacherDaoProxy(ITeacherDao target) {
this.target = target;
}
@Override
public void show() {
System.out.println("开始代理....");
target.show();
System.out.println("提交.......");
}
}
public class Client {
public static void main(String[] args) {
//创建目标对象
TeacherDao teacherDao = new TeacherDao();
//创建代理对象,同时将被代理对象传递给代理对象
TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
//通过代理对象,调用到被代理对象的方法
//即:执行的是代理对象的方法,代理对象再去调用目标对象的方法
teacherDaoProxy.show();
}
}
4、优缺点
(1)优点:在不修改目标对象的功能前提下,能通过代理对象对目标对象功能扩展。
(2)缺点:因为代理对象要与目标对象实现一样的接口,所以会有很多代理类。
(3)一旦接口增加方法,目标对象与代理对象都要维护。
三、动态代理
//接口
public interface ITeacherDao {
//授课的方法
void show();
}
public class TeacherDao implements ITeacherDao{
@Override
public void show() {
System.out.println("老师正在授课中······");
}
}
public class ProxyFactory{
//维护一个目标对象,Object
private Object target;
//构造器,对target进行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//给目标对象 生成一个代理对象
public Object getProxyInstance(){
/**
* ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法固定
* Class<?>[] interfaces:目标对象实现的接口类型,使用泛型的方式确认类型
* InvocationHandler h:
* 事件处理,执行目标对象的方法时,会触发事件处理器方法,会把当前执行的目标对象方法作为参数处理
*/
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK代理开始");
//反射机制调用目标对象的方法
Object returnValue = method.invoke(target,args);
System.out.println("JDK代理结束");
return returnValue;
}
});
}
}
public class Client {
public static void main(String[] args) {
//1、创建一个目标对象
ITeacherDao teacherDao = new TeacherDao();
//2、给目标对象,创建代理对象
ITeacherDao proxyInstance = (ITeacherDao) new ProxyFactory(teacherDao).getProxyInstance();
System.out.println(proxyInstance);
//class com.sun.proxy.$Proxy0内存中动态生成了代理对象
System.out.println(proxyInstance.getClass());
//3、通过代理对象,调用目标对象的方法
proxyInstance.show();
}
}
四、代理模式优缺点
1、优点
(1)可以起到保护目标对象
的作用。可以扩展目标对象
的功能。
(2)在某种程度上降低了系统的耦合度
,增强了程序的可扩展性。
2、缺点
(1)会造成系统设计中类的数量增加
,增加了系统的复杂度
(2)增加一个代理对象,会造成请求处理速度变慢;