1.定义
- 通过代理对象来间接访问真实对象,简化用户端的代码逻辑
2.UML类图
- 角色介绍
ISubject : 主题抽象接口
RealSubject : 真实主题类
ProxySubject : 代理主题类 - 要点说明
静态代理方式,真实主题与代理主题需要实现同一接口,并且代理主题持有真实主题引用
3.UML示例代码
/**
* Copyright (C), 2016-2020
* FileName: ISubject
* Author: wei.zheng
* Date: 2019/12/31 9:16
* Description: 抽象主题接口
*/
public interface ISubject {
void visit();
}
/**
* Copyright (C), 2016-2020
* FileName: RealSubject
* Author: wei.zheng
* Date: 2019/12/31 9:17
* Description: 具体主题类
*/
public class RealSubject implements ISubject {
@Override
public void visit() {
System.out.println("Visit RealSubject");
}
}
静态代理示例
/**
* Copyright (C), 2016-2020
* FileName: ProxySubject
* Author: wei.zheng
* Date: 2019/12/31 9:17
* Description: 代理主题类 - 静态代理
*/
public class ProxySubject implements ISubject {
private ISubject subject;
public ProxySubject(ISubject subject) {
this.subject = subject;
}
@Override
public void visit() {
subject.visit();
}
}
/**
* Copyright (C), 2016-2020
* FileName: Client
* Author: wei.zheng
* Date: 2019/12/31 9:20
* Description: 代理模式用户类
*/
public class Client {
public static void main(String[] args) {
ISubject realSubject = new RealSubject();
ISubject proxySubject = new ProxySubject(realSubject);
proxySubject.visit();
}
}
动态代理示例
/**
* Copyright (C), 2016-2020
* FileName: DynamicProxy
* Author: wei.zheng
* Date: 2019/12/31 9:23
* Description: 动态代理类
*/
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object, args);
}
}
/**
* Copyright (C), 2016-2020
* FileName: DynamicClient
* Author: wei.zheng
* Date: 2019/12/31 9:25
* Description: 动态代理用户类
*/
public class DynamicClient {
public static void main(String[] args){
RealSubject realSubject = new RealSubject();
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
ClassLoader classLoader = realSubject.getClass().getClassLoader();
ISubject proxySubject = (ISubject) Proxy.newProxyInstance(classLoader,new Class[]{ISubject.class},dynamicProxy);
proxySubject.visit();
}
}
// 运行结果
2019-12-31 21:51:03.224 21366-21366/com.example.proxy I/System.out: 静态代理
2019-12-31 21:51:03.225 21366-21366/com.example.proxy I/System.out: Visit RealSubject
2019-12-31 21:51:03.225 21366-21366/com.example.proxy I/System.out: 动态代理
2019-12-31 21:51:03.228 21366-21366/com.example.proxy I/System.out: Visit RealSubject
4.总结
- 静态代理
优点:用户类与真实主题类解耦
缺点:几乎无缺点 - 动态代理
通过一个代理类来代理多个真实主题类,本质上是将代理类与真实主题类解耦