为什么需要代理设计模式
1、在JavaEE分层开发开发中,哪个层次对于我们来讲最重要?
Service层,因为里面封装了我们想要实现的业务,用于满足用户需求
2、Service层中包含了哪些代码?
Service层中 = 核心功能(几十行 上百行代码)+ 额外功能(附加功能)
1.核心功能(代码量较多):业务运算,DAO调用
2.额外功能(附加功能,不属于业务,可有可无,代码量小):事务、日志、性能 …
3、额外功能书写在Service层中好不好?
1.Service层的调用者的角度(Controller):需要在Service层书写额外功能。
2.软件设计者:Service层不需要额外功能。
4、现实生活中解决方式
引入中介或者是代理的方式。
代理设计模式
概念
代理设计模式概念: 通过代理类,为原始类(目标)增加额外的功能
好处:利于原始类(目标)的维护
名词解释
目标类 / 原始类:指的是 业务类 (核心功能 --> 业务运算、DAO调用)
目标方法 / 原始方法:目标类(原始类)中的方法就是目标方法(原始方法)
额外功能 / 附加功能:日志、事务、性能 …
代理开发的核心要素
代理类 = 目标类(原始类) + 额外功能 + 原始类(目标类)实现相同的接口
房东 --- 目标类
public interface UserService {
m1
m2
}
public UserServiceImpl implements UserServiceImpl {
m1 ---> 业务运算、调用DAO
m2
}
----------------------------------------------------
中介 --- 代理类:要实现目标类相同的接口
public UserServiceProxy implements UserService {
m1
m2
}
静态代理编码
每一个原始类都会手工编写一个代理类(.java .class)
public class User {
private String name;
private String password;
}
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);
}
}
静态代理存在的问题
- 静态类文件数目过多,不利于项目管理
- 代码可维护性差
评论区