结构型模式(代理模式)
Posted 伍妖捌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构型模式(代理模式)相关的知识,希望对你有一定的参考价值。
代理模式
对现有业务增强功能
下面以添加日志功能为例
静态代理
现有接口和实现类
public interface IUserService {
void save();
void delete();
}
public class UserService implements IUserService {
@Override
public void save() {
System.out.println("保存用户逻辑");
}
@Override
public void delete() {
System.out.println("删除用户逻辑");
}
}
改进,在原有的基础上添加日志功能,不使用代理模式,可以直接在对象的方法中添加日志即可
@Slf4j
public class UserService implements IUserService {
@Override
public void save() {
log.warn("开始save用户");
System.out.println("保存用户逻辑");
log.warn("用户save成功");
}
@Override
public void delete() {
log.warn("开始delete用户");
System.out.println("删除用户逻辑");
log.warn("用户delete成功");
}
}
接下来通过静态代理实现
@Data
@Slf4j
public class UserServiceProxy implements IUserService {
private UserService userService;
@Override
public void save() {
log.warn("开始save用户");
userService.save();
log.warn("用户save成功");
}
@Override
public void delete() {
log.warn("开始delete用户");
userService.delete();
log.warn("用户delete成功");
}
}
客户端使用
public class Client {
public static void main(String[] args) {
UserServiceProxy userServiceProxy = new UserServiceProxy();
userServiceProxy.setUserService(new UserService());
userServiceProxy.save();
}
}
动态代理
在类加载的过程中,动态生成代理类
JDK动态代理
基于接口的动态代理
创建代理处理类,主要是动态生成代理类,以及调用代理方法。
public interface IUserService {
void save();
void delete();
}
public class UserService implements IUserService {
@Override
public void save() {
System.out.println("保存用户逻辑");
}
@Override
public void delete() {
System.out.println("删除用户逻辑");
}
}
@Slf4j
public class ProxyInvocationHandler implements InvocationHandler {
Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object proxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log.warn("开始{}用户", method.getName());
Object obj = method.invoke(target, args);
log.warn("用户{}成功", method.getName());
return obj;
}
}
客户端使用
public class Client {
public static void main(String[] args) {
UserService userService = new UserService();
ProxyInvocationHandler handler = new ProxyInvocationHandler();
handler.setTarget(userService);
IUserService proxy = (IUserService) handler.proxy();
proxy.save();
}
}
Cglib动态代理
以上是关于结构型模式(代理模式)的主要内容,如果未能解决你的问题,请参考以下文章