java常用的设计模式-代理模式

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即可

猜你喜欢

转载自www.cnblogs.com/xiaokang-share/p/9270353.html