代理模式
代理模式的作用
为其他对象提供一种代理以控制对这个对象的访问
某些情况下,一个客户不想或者不能直接引用另一个对象,
而代理对象可以在客户端和目标对象之间起到中介作用
代理模式的角色
抽象角色,代理角色,真实角色
抽象角色:声明真实对象和代理对象的公共接口
代理角色:代理对象含有真实对象的引用,从而可以操作真实对象,
同时代理对象提供与真实对象相同的接口以便在任何时候都可以代替真实对象
同时,代理对象在操作真实对象时,可以附加其他的操作,相当于把真实对象封装了
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
实现自己的代理模式
查看案例
代理模式注意
使用代理模式,那么真实角色先存在,并在代理对象的内部增加真实角色的引用
实际使用时,一个真实对象对应一个代理对象,如果大量使用代理模式会导致类的急剧膨胀
此外,如果不知道事先不知道真实角色,该如何代理
可以使用动态代理类来解决
Java动态代理类位于java.lang.reflect包下,一般有下面两个类
Interface InvocationHandler定义了一个方法
public Object invoke(Object object,Method method,Object[] args);
在实际使用时,
第一个参数是指代理类,
第一个参数是指被代理的方法,
第三个参数是该方法的参数数组
Proxy:该类为动态代理类,作用类似于实现自己的代理模式案例的ProxySubject,
其中主要包含一下内容
实现自己的代理模式
package com.itlwc;
/**
* 实现自己的代理模式
*/
public class Test {
public static void main(String[] args) {
Subject subject = new ProxySubject();
subject.request();
}
}
// 抽象角色
abstract class Subject {
public abstract void request();
}
// 真实角色
class RealSubject extends Subject {
public void request() {
System.out.println("from real subject");
}
}
// 代理角色
class ProxySubject extends Subject {
RealSubject realSubject;
//代理了真实角色的方法
public void request() {
if (null == realSubject) {
realSubject = new RealSubject();
}
realSubject.request();
}
//这里还可以附加自己的方法
}