1.静态代理
被代理的类接口
package com.design2;
public interface EmployeeService {
void add(String name);
void delete(Integer eid);
}
被代理的类接口的实现类
package com.design2;
public class EmployeeServiceImpl implements EmployeeService {
@Override
public void add(String name) {
System.out.println("添加操作");
}
@Override
public void delete(Integer eid) {
System.out.println("删除操作");
}
}
增强类
package com.design2;
public class MyTransaction {
public void before(){
System.out.println("事物开始");
}
public void after(){
System.out.println("事物结束");
}
}
代理类
package com.design2;
public class UserProxy implements EmployeeService {
EmployeeService empService;
MyTransaction transaction;
public UserProxy(EmployeeService empService,MyTransaction transaction){
this.empService = empService;
this.transaction = transaction;
}
@Override
public void add(String name) {
transaction.before();
empService.add(name);
transaction.after();
}
@Override
public void delete(Integer eid) {
transaction.before();
empService.delete(eid);
transaction.after();
}
}
静态代理的两个弊端
1.一个代理对象只能代理一个类型的对象,UserProxy 只代理了EmployeeService 类型的对象
2.维护性差,如果被代理对象新增了方法,则代理对象也需要做修改。
动态代理
package com.design2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class CommonProxy implements InvocationHandler {
private Object target;
private MyTransaction transaction;
public CommonProxy(Object target,MyTransaction transaction){
this.target = target;
this.transaction = transaction;
}
@Override
public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
transaction.before();
method.invoke(target, arg2);
transaction.after();
return null;
}
}
代理对象CommonProxy 只需要实现InvocationHandler即可