代理模式是一种设计模式,它允许我们使用代理对象作为另一个对象的接口,以控制对该对象的访问。代理对象可以充当其他对象的代表,通过它们可以控制对那些对象的访问。
Java中实现代理模式,主要有两种方式可以选择,一种是使用静态代理,一种是使用动态代理。静态代理需要手动编写代理类,而动态代理不需手动编写代理类。
下面以使用Java实现静态代理为例,来介绍代理模式的使用场景和作用。
假设我们有一个UserService接口,提供了获取用户信息和修改用户信息的功能。我们需要在不修改原有UserService接口的基础上,增加一个对用户信息进行记录的功能,这时就可以使用代理模式。
首先,我们定义UserService接口:
public interface UserService {
void getUserInfo();
void updateUserInfo();
}
接着,我们定义UserService实现类:
public class UserServiceImpl implements UserService {
public void getUserInfo() {
System.out.println("获取用户信息");
}
public void updateUserInfo() {
System.out.println("修改用户信息");
}
}
然后,我们定义一个代理类UserProxy实现UserService接口,并包含一个UserService对象作为属性,用来执行UserService对象的功能。UserProxy代理类可以在UserService对象的功能调用前或调用后,添加一些额外的功能,比如对用户的操作进行记录。
public class UserProxy implements UserService {
private UserService userService;
public UserProxy(UserService userService) {
this.userService = userService;
}
public void getUserInfo() {
System.out.println("获取用户信息之前,记录用户操作");
userService.getUserInfo();
System.out.println("获取用户信息之后,记录用户操作");
}
public void updateUserInfo() {
System.out.println("修改用户信息之前,记录用户操作");
userService.updateUserInfo();
System.out.println("修改用户信息之后,记录用户操作");
}
}
最后,我们可以通过以下代码创建一个UserService对象和其代理对象,并调用代理对象的方法。
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService userProxy = new UserProxy(userService);
userProxy.getUserInfo();
userProxy.updateUserInfo();
}
代理模式的作用是可以在不改变原有接口的情况下,增加一些额外的功能。在上述例子中,代理类UserProxy就是对UserService接口的增强,可以在调用getUserInfo和updateUserInfo方法前后增加记录用户操作的功能。代理模式还可以实现远程代理、虚拟代理、安全代理等功能,非常灵活,是一种常用的设计模式。