1.代理模式
1.1.简介
1>.代理模式:客户端直接使用的都是代理对象,不知道真实的对象是谁,而代理对象可以在客户端和真实对象之间起到中介的作用;
2>.代理对象完全了包含真实对象,客户端使用的都是代理对象的方法,和真实对象没有直接关系(有间接关系);
3>.代理模式的职责:就是把不是真实对象该做的事情从真实对象中抽离,达到职责分离的设计思想;
4>.代理的目的:为了给目标方法做功能增强;
注意: 真实对象就是真正要处理/增强的对象(实现类/接口)!!
2.静态代理模式
2.1.简介
1>.静态代理:在程序运行前就已经存在代理类的字节码文件(/需要开发人员自己手动实现代理类),代理对象和真实对象的关系在运行前就已经确定了
;业务类只需要关注业务逻辑本身,保证了业务的重用性;把真实对象隐藏起来,保护真实对象;
2>.说白了就是由程序员自己创建代理类,将真实对象中实现的方法放到代理类中再去实现一次(实现相同的接口,调用接口的方法去实现),然后在代理类中对实现的方法进行增强,客户端不能直接操作真实对象(方法),只能操作代理对象,这样一来,真实代码没有改动,但是功能却增强了;
2.2.代码实现
2.2.1.需求
模拟spring事务增强;
2.2.2.代码实现
1>.创建service接口及实现类
public interface IEmployeeService {
void save(Employee employee);
void update(Employee employee);
}
@Service
public class EmployeeServiceImpl implements IEmployeeService {
@Autowired
private IEmployeeDao employeeDao;
@Override
public void save(Employee employee) {
employeeDao.save(employee);
System.out.println("保存成功");
}
@Override
public void update(Employee employee) {
employeeDao.update(employee);
throw new RuntimeException("手动抛出异常");
}
}
2>.定义事务管理器类
/**
*模拟事务管理器
*/
@Component("txManager")
public class TransactionManager {
public void begin(){
System.out.println("开启事务");
}
public void commit(){
System.out.println("提交事务");
}
public void rollback(){
System.out.println("回滚事务");
}
}
3>.定义静态代理类
/**
* 静态代理类,将真实对象的方法重新实现一遍,要实现service接口
*/
@Component
public class StaticProxy implements IEmployeeService {
//包含真实的对象/委托对象(接口)
//引入接口,便于扩展,该接口的实现类对应的方法都可以实现增强
@Autowired
private IEmployeeService iEmployeeService;
@Autowired
private TransactionManager txManager;
@Override
public void save(Employee employee) {
//开启事务
txManager.begin();
try {
iEmployeeService.save(employee);
txManager.commit();
} catch (Exception e) {
e.printStackTrace();
txManager.rollback();
}
}
@Override
public void update(Employee employee) {
//开启