- 代理模式是GOF提出的23种设计模式中最为经典的模式之一,代理模式是对象的结构模式,它给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。简单的说,代理对象可以完成比原对象更多的职责,当需要为原对象添加横切关注功能时,就可以使用原对象的代理对象。
- 下面是一个简单的入门案例
①先写一个接口 并且实现这个接口
public interface UserService {
void add();
String delete();
}
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("add.....");
}
@Override
public String delete() {
System.out.println("delete.....");
return "delete";
}
}
②写一个MyProxy类
public class MyProxy implements InvocationHandler{
private Object target;
//Proxy是反射包下的Proxy(java.lang.reflect.Proxy;),核心方法是newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)方法
//第一个参数为得到目标对象的类加载器
//第二个参数为得到这个类的接口
//第三个参数是你要增强的方法,可以在这了写一个类 ,我图方便所以写了this,这个类要实现InvocationHandler接口重写invoke方法
public Object getProxy(Object target) {
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
}
//这些方法可以新建一个类实现 InvocationHandler 接口这样耦合度更低
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String methodName = method.getName();//可以获得方法的名字
if("add".equals(methodName)) {
System.out.println("add方法加强了");
}else if("delete".equals(methodName)){
System.out.println("delete方法加强了");
}
Object invoke = method.invoke(target, args);
return invoke;
}
}
③测试
@Test
public void test() {
MyProxy myProxy = new MyProxy();
UserServiceImpl userServiceImpl = new UserServiceImpl();
UserService userService =(UserService) myProxy.getProxy(userServiceImpl);
userService.add();
System.out.println("----------------------------");
String delete = userService.delete();
System.out.println("delete() 返回值:"+delete);
}
测试结果
补充: 被代理的类要有实现的接口,如果没有实现的接口,就要用cglib的方式了