- 代理设计模式一种结构型设计模式。为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用。可以提高目标类的纯洁性。
1.静态代理模式。
1.1 静态代理模式类图
分为目标类和代理类,目标类和代理类实现一个共同的接口,目标类和代理类之间的关系是一对一的关系。
1.2 角色分类
1.抽象角色
通过接口或抽象类声明真实角色实现的业务方法。
2.代理角色
实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
3.目标角色
实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用
1.3 优点
1.代理模式能将代理对象与真实对象被调用的目标对象分离,一定程度上降低了系统的耦合度,扩展性好。
2.保护目标对象,增强了目标对象的纯洁性。
1.4 代码实现
- PaymentService接口
public interface PaymentService {
//支付宝支付
String aliPay();
//微信支付
int wxPay();
}
- PaymentServiceImpl目标类
/*
* 支付业务服务类
*/
public class PaymentServiceImpl implements PaymentService{
@Override
public String aliPay() {
System.out.println("使用支付宝支付");
return "支付宝支付" ;
}
@Override
public int wxPay() {
System.out.println("使用微信支付");
return 0;
}
}
- PaymentServiceProxy代理类
public class PaymentServiceProxy implements PaymentService{
//创建日志对象
private static Logger log = Logger.getLogger(PaymentServiceImpl.class.getName());
//目标类
private PaymentService targetPaymentService;
public PaymentServiceProxy() {
//实例化对象
targetPaymentService = new PaymentServiceImpl();
}
@Override
public String aliPay() {
log.info("使用支付宝支付!");
return targetPaymentService.aliPay();
}
@Override
public int wxPay() {
log.info("使用微信支付!");
return targetPaymentService.wxPay();
}
}
- Test测试类
public class Test {
public static void main(String[] args) {
//测试类直接调用代理类
PaymentService paymentService = new PaymentServiceProxy();
paymentService.aliPay();
paymentService.wxPay();
}
}
#2.动态代理模式。
2.1动态代理模式类图
动态代理模式中代理类由JDK提供的Proxy类产生,通过反射的方式在运行期间进行代理类的生成。
2.2优点
相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
2.3代码实现
- PaymentService接口
public interface PaymentService {
//支付宝支付
String aliPay();
//微信支付
int wxPay();
}
- PaymentServiceImpl目标类
/*
* 支付业务服务类
*/
public class PaymentServiceImpl implements PaymentService{
@Override
public String aliPay() {
System.out.println("使用支付宝支付");
return "支付宝支付" ;
}
@Override
public int wxPay() {
System.out.println("使用微信支付");
return 0;
}
}
- ProformanceInvocationHandler类继承自InvocationHandler接口
public class ProformanceInvocationHandler implements InvocationHandler{
//目标对象
private Object obj;
//传入目标对象
public ProformanceInvocationHandler(Object obj) {
this.obj = obj;
}
/**
* @param proxy:运行时动态代理对象
* @param method:目标方法
* @param args:目标方法的参数数组
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(proxy.getClass().getName());
long begin = System.currentTimeMillis();
//执行方法
Object returnValue = method.invoke(obj, args);
long end = System.currentTimeMillis();
System.out.printf("%s的%s方法共耗时%d毫秒",obj.getClass().getSimpleName(),method.getName(),(end-begin));
return returnValue;
}
}
- Test测试类
public class Test {
public static void main(String[] args) {
//创建目标对象
PaymentService pay = new PaymentServiceImpl();
/*
* 第一个参数:Loader对象
* 第二个参数:传入公共父类
* 第三个参数:InvocationHandler实现类
*/
PaymentService pasment = (PaymentService)Proxy.newProxyInstance(
pay.getClass().getClassLoader(),
pay.getClass().getInterfaces(),
new ProformanceInvocationHandler(pay));
pasment.wxPay();
}
}