1、代理模式
所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
举一个例子,生活中乘坐出租车。
接口
public interface traffic {
public void traffic();
}
真实类
//真实类
public class real implements traffic{
public void traffic() {
System.out.println("乘坐出租车");
}
}
代理类
//代理类
public class proxy implements traffic{
private real rl=new real();
public void traffic(){
doBefore();
rl.traffic();
doAfter();
}
public void doBefore(){
System.out.println("前置处理");
}
public void doAfter(){
System.out.println("后置处理");
}
}
客户端测试类
public class Client {
public static void main(String[] args){
traffic tr=new proxy();
tr.traffic();
}
}
代理模式很容易理解,就是在两个角色之间在加入了个中介,生活中租房子的租户找中介租房子也是这样的方式。
2、动态代理
但是,在java中还有个动态代理的实现方式。
实现方法类似,只不过是把代理角色的生成交给了java类。
代理角色
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
// 目标对象
private Object target;
/**
* 构造方法
* @param target 目标对象
*/
public MyInvocationHandler(Object target) {
super();
this.target = target;
}
/**
* 执行目标对象的方法
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在目标对象的方法执行之前简单的打印一下
System.out.println("------------------before------------------");
// 执行目标对象的方法
Object result = method.invoke(target, args);
// 在目标对象的方法执行之后简单的打印一下
System.out.println("-------------------after------------------");
return result;
}
/**
* 获取目标对象的代理对象
* @return 代理对象
*/
public Object getProxy() {
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(), this);
}
}
目标角色接口
/**
* 目标对象实现的接口,用JDK来生成代理对象一定要实现一个接口
* @author zyb
* @since 2012-8-9
*
*/
public interface UserService {
/**
* 目标方法
*/
public abstract void add();
}
目标角色的实现
/**
* 目标对象
* @author zyb
* @since 2012-8-9
*
*/
public class UserServiceImpl implements UserService {
/* (non-Javadoc)
* @see dynamic.proxy.UserService#add()
*/
public void add() {
System.out.println("--------------------add---------------");
}
}
客户端测试
public class ProxyTest {
public static void main(String[] args){
// 实例化目标对象
UserService userService = new UserServiceImpl();
// 实例化InvocationHandler
MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);
// 根据目标对象生成代理对象
UserService proxy = (UserService) invocationHandler.getProxy();
// 调用代理对象的方法
proxy.add();
}
}