- 代理模式,是对一个对象提供代理,用代理对象控制对实际对象的访问。
- 静态代理,可以分为抽象角色,真实角色,代理角色三种角色。
/**
* 码农接口(抽象角色)
*/
public interface Coder {
// 码农可以编码
void develop(String demandName);
}
/**
* java码农
*/
public class JavaCoder implements Coder {
/**
* java码农编码接口
*/
@Override
public void develop(String demandName) {
System.out.println("java码农进行编码...");
}
}
/**
* 码农代理类
*/
public class CoderProxy implements Coder {
private Coder javaCoder = null;
public CoderProxy(Coder javaCoder) {
this.javaCoder = javaCoder;
}
@Override
public void develop(String demandName) {
if (demandName.startsWith("Add")) {
// 不再接受新增功能的需求了
System.out.println("No longer receiver 'Add' demand!");
return;
}
javaCoder.develop(demandName);
}
}
public class Client {
public static void main(String[] args) {
// 真实的java码农对象
Coder realCoder = new JavaCoder();
// 代理对象
Coder proxyCoder = new CoderProxy(realCoder);
// 通过代理访问对象
proxyCoder.develop("Add new user");
}
}
- 动态代理,相对于静态代理而言,动态代理是在代码运行时创建的一种模式。
- 实现动态代理,通过动态代理类来实现,不需要实现代理类也不需要实现抽象接口。
/**
* 码农动态代理类
* 通过实现InvocationHandler接口的方式实现动态代理类
*/
public class CoderDynamicProxy implements InvocationHandler {
// 代理的实例
private Coder coder;
public CoderDynamicProxy(Coder coder) {
this.coder = coder;
}
/**
* 调用代理方法
*
* @param proxy
* @param method 具体方法
* @param args 具体方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before...");
Object result = method.invoke(coder, args);
System.out.println("after...");
return result;
}
}
- 动态代理可以在程序运行时,同时对多个方法进行代理,不需要对这些方法一个个的进行修改。
/**
* 客户端
*/
public class Client2 {
/**
* 使用码农动态代理类
* @param args
*/
public static void main(String[] args) {
// 要代理的码农对象
Coder coder = new JavaCoder();
// 动态代理代理类
InvocationHandler handler = new CoderDynamicProxy(coder);
// 动态生成一个代理类,该代理类对所有方法进行了代理
Coder proxy = (Coder)Proxy.newProxyInstance(coder.getClass().getClassLoader(), coder.getClass().getInterfaces(), handler);
proxy.develop("add");
}
}