前言
代理模式的核心就是
在不改变原有代码的基础上对一个方法进行功能性的增强,通常是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
说简单点,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。
1 静态代理
结构图
服务接口 Service
package com.weh.service;
/**
*服务接口
*/
public interface Service {
void expression();
}
服务接口实现类 ServiceImpl
package com.weh.realservice;
import com.weh.service.Service;
/**
* 服务接口实现类
* */
public class ServiceImpl implements Service {
@Override
public void expression() {
System.out.println("我是真实的服务商!");
}
}
服务代理商 ServiceProxy
package com.weh.serviceproxy;
import com.weh.service.Service;
public class ServiceProxy implements Service {
private Service realService;
public ServiceProxy(Service service) {
this.realService=service;
}
@Override
public void expression() {
realService.expression();
System.out.println("-----------------------------");
System.out.println("我是服务代理商!");
}
}
客户端 Client
public class Client {
public static void main(String[] args) {
/**
*启动服务
* */
Service service = new ServiceProxy(new ServiceImpl());
service.expression();
}
}
结果展示
2 动态代理(部分代码)
结构图
动态代理类实现 DynamicProxy
package com.weh.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 动态代理实现类
* */
public class DynamicProxy implements InvocationHandler {
//反射代理目标类
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
/*
* 反射代理过程
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("之前的方法名:"+method.getName());
Object result = method.invoke(target,args);
System.out.println("之后的方法名:"+method.getName());
return result;
}
}
测试类
import com.weh.realservice.RealServiceImpl;
import com.weh.service.Service;
import java.lang.reflect.Proxy;
public class ClientTest {
public static void main(String[] args) {
Service service = (Service) Proxy.newProxyInstance(ClientTest.class.getClassLoader(),
new Class[]{Service.class},new DynamicProxy(new ServiceImpl()));
service.expression();
}
}
结果展示