设计模式之—代理模式
1.代理模式定义
Provide a surrogate or placeholder for another object to control access to it. 对其他对象提供一种代理,以控制对这个对象的访问
2.代理模式通用类图
代理模式的通用类图如下:
其中Subject为抽象主题角色:
Subject为普通业务接口
RealSubject为具体主题角色:
此类为具体被代理的对象
Proxy为代理类:
此类负责执行被代理的功能,并且在处理前后做预处理和善后操作
3.通用模式的代码实现:
Subject类:
public interface Subject {
/**
* 发送request请求
*/
void request();
}
RealSubject类:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("Send request:" + "....");
}
}
Proxy代理类,在代理类中可以通过构造函数或setter方法传入。
public class Proxy implements Subject {
private Subject subject;
public Proxy(Subject subject){
this.subject = subject;
}
@Override
public void request() {
subject.request();
}
private void before(){
// do before
}
private void after(){
//do after
}
}
4.动态代理
动态代理:是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。
其中Spring的AOP是典型的动态代理模式
下面我们以网络连接中的代理为例说明动态代理,类图如下:
首先定义一个网络连接器:Connector,此方法中只定义了一个connect方法,用于创建网络连接,代码如下:
public interface Connector {
/**
* 建立网络连接
*/
void connect();
}
然后定义Connector接口的实现类如下:
public class NetworkConnector implements Connector {
@Override
public void connect() {
System.out.println("Connect to network.");
}
}
此类为被代理的对象。
最后定义动态代理类,JDK中定义了用于动态代理的接口
InvocationHandler,实现动态代理的类必须实现此接口。
代码如下:
public class NetworkConnectorDP implements InvocationHandler {
private Object realObject;
public NetworkConnectorDP(Object realObject){
this.realObject = realObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
return method.invoke(this.realObject, args);
}
}
最后定义Client带使用动态代理功能,代码如下:
public class Client {
public static void main(String[] args) throws Exception {
Connector connector = new NetworkConnector();
InvocationHandler handler = new NetworkConnectorDP(connector);
ClassLoader classLoader = connector.getClass().getClassLoader();
Connector proxy = (Connector) Proxy.newProxyInstance(classLoader, new Class[]{Connector.class}, handler);
System.out.println("Start connect to network.");
proxy.connect();
System.out.println("Connect to network finished.");
}
}