目录
一、为什么需要代理设计模式
在项目的开发过程中我们知道service层是整个项目中最重要的部分,在service中一般会有两个部分,一个是核心业务,一个是额外功能。那么问题来了,这个额外功能放在service层好不好呢?其实在service中有额外功能是不好的,是不利于代码的维护的。所以这里就有了代理设计模式
这样的案例在生活中也是很常见的,就好比说租房中的中介公司就是一个代理(代理类),当有人需要租房的时候直接去找中介公司就可以了,通过中介公司也可以对接到房东签合同,这样就省去了房东自己去打广告的麻烦,所以代理设计模式是非常有必要的!
二、代理设计模式
通过上述的描述,我们发现代理设计模式就是通过一个代理类,为目标类增加额外的功能,这样做的目的就是利于目标类的维护。
1)代理开发的核心要素
由上述过程我们发现在代理类中,目标类的功能是需要有的(中介没有房东出租屋的信息怎么租房呢)同时还需要额外的功能(既然是中介公司那肯定要有广告信息)。有了这两个概念之后我们就能知道代理类和目标类应该实现同一个接口
2)编码实现
首先应该有一个service的接口类,这里直接创建一个UserService接口类
public interface UserService {
void register();
boolean login();
}
接下来再创建一个目标类UserServiceImpl实现这个接口(这个就好比是房东)
public class UserServiceImpl implements UserService{
@Override
public void register() {
System.out.println("register核心功能正在执行");
}
@Override
public boolean login() {
return false;
}
}
最后创建一个代理类UserServiceProxy,这个类既要有目标类的功能,也要有自己的额外功能(中介的广告)
public class UserServiceProxy implements UserService{
// 需要有目标类的方法,所以这里需要有目标类
UserServiceImpl user = new UserServiceImpl();
@Override
public void register() {
// 添加额外功能,这里就不写复杂功能了,打印代替
System.out.println("----这里是额外功能的添加----log");
// 将目标类的方法实现
user.register();
}
@Override
public boolean login() {
// 添加额外功能,这里就不写复杂功能了,打印代替
System.out.println("----这里是额外功能的添加----log");
return user.login();
}
}
3)进行测试
此时就可以发现这里的目标类中的核心方法执行了,同时这里的额外功能也执行了,这时说明代理的过程已经成功了
public void test1() {
UserService userService = new UserServiceProxy();
userService.register();
userService.login();
}
三、静态代理设计模式
上述的代理的过程称为静态代理模式:为每一个目标类手工编写一个代理类。
3.1 存在的问题
静态代理的过程中我们会发现其实存在一些问题,因为每一个目标类都需要手动编写一个代理类,那么在这个过程中如果代理类过多就会使得项目的管理难度上升。同时,在静态代理的过程中这些额外功能都是已经写死在代理类中了,后续想要修改这些额外功能就会变得非常的复杂!说了这么多,那有解决办法吗?有!那就是Spring提供的动态代理开发!