一、为什么需要代理设计模式
在 JavaEE 分层开发开发中,哪个层次对于我们来讲最重要?Service 层
Service 层中包含了哪些代码?
- 核心功能(代码量较多):业务运算,DAO 调用
- 额外功能(附加功能,不属于业务,可有可无,代码量小):事务、日志、性能 …
额外功能书写在 Service 层好不好?
- Service 层的调用者的角度(Controller):需要在 Service 层书写额外功能。
- 软件设计者:Service 层不需要额外功能。
拿现实生活中的例子来做对比,解决方案是 引入一个代理。
二、代理设计模式
概念:通过代理类,为原始类(目标类)增加额外的功能
好处:利于原始类(目标类)的维护
名词解释
目标类 / 原始类:指的是 业务类 (核心功能 --> 业务运算、DAO调用)
目标方法 / 原始方法:目标类(原始类)中的方法就是目标方法(原始方法)
额外功能 / 附加功能:日志、事务、性能 …
代理开发的核心要素
代理类 = 目标类(原始类) + 额外功能 + 原始类(目标类)实现相同的接口
房东 --- 目标类
public interface UserService {
m1
m2
}
public UserServiceImpl implements UserServiceImpl {
m1 ---> 业务运算、调用DAO
m2
}
----------------------------------------------------
中介 --- 代理类:要实现目标类相同的接口
public UserServiceProxy implements UserService {
m1
m2
}
三、静态代理编码
静态代理:为每⼀个原始类,手工编写⼀个代理类(.java .class)
public class User {}
public interface UserService {
void register(User user);
boolean login(String name, String password);
}
public class UserServiceImpl implements UserService {
@Override
public void register(User user) {
System.out.println("UserServiceImpl.register 业务运算 + DAO");
}
@Override
public boolean login(String name, String password) {
System.out.println("UserServiceImpl.login 业务运算 + DAO");
return true;
}
}
/**
* 静态代理类编码实现
*/
public class UserServiceProxy implements UserService { // 实现原始类相同的接口
private UserService userService = new UserServiceImpl(); // 代理类中必须有原始类
@Override
public void register(User user) {
System.out.println("---log---"); // 额外功能
userService.register(user);
}
@Override
public boolean login(String name, String password) {
System.out.println("---log---"); // 额外功能
return userService.login(name, password);
}
}
四、静态代理存在的问题
-
静态类文件数量过多,不利于项目管理
UserServiceImpl、UserServiceProxy、OrderServiceImpl、OrderServiceProxy… -
额外功能维护性差:在代理类中修改额外功能较为麻烦