在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
1.静态代理
1.1 定义接口
/**
* 接口
*/
public interface UserService {
/**
* 添加方法
*/
void add();
/**
* 删除方法
*/
void delete();
}
1.2 实现接口类
/**
* 接口实现类
*/
public class UserServiceImpl implements UserService {
@Override
public void add() {
System.out.println("--------------------add---------------");
}
@Override
public void delete() {
System.out.println("--------------------delete---------------");
}
}
1.3 代理类
/**
* 代理类
*/
public class StaticProxy implements UserService {
UserService userService;
public StaticProxy(UserServiceImpl userService){
this.userService=userService;
}
@Override
public void add() {
userService.add();
System.out.println("这是代理类做的事");
}
@Override
public void delete() {
userService.delete();
}
}
1.4 测试静态代理
public class StaticTest {
@Test
public void test1(){
UserService userService=new StaticProxy(new UserServiceImpl());
userService.add();
}
}
2.动态代理
2.1 动态代理
/**
* 实现自己的InvocationHandler
*/
public class MyInvocationHandler implements InvocationHandler {
private static Object target;
/**
* 执行目标对象的方法
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在目标对象的方法执行之前简单的打印一下
System.out.println("这是代理类做的事A");
// 执行目标对象的方法
Object result = method.invoke(target, args);
// 在目标对象的方法执行之后简单的打印一下
System.out.println("这是代理类做的事B");
return result;
}
/**
* 获取目标对象的代理对象
*
* @return 代理对象
*/
public static Object getProxy(Object target) {
MyInvocationHandler.target=target;
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler());
}
}
2.2测试
/**
* 动态代理
*/
public class ProxyTest {
@Test
public void testProxy() throws Throwable {
// 实例化目标对象
UserServiceImpl userService=new UserServiceImpl();
// 根据目标对象生成代理对象
UserService proxy = (UserService) MyInvocationHandler.getProxy(userService);
// 调用代理对象的方法
proxy.add();
}
}