代理模式
在了解AOP之前,我们先了解一种设计模式:代理模式
· 代理模式是AOP实现的底层原理
那么使用代理模式和不使用代理模式有什么区别?代理模式能给我们带来什么?
我们先使用一个web中常用到的业务案例来说一下,在web开发中常见的业务是,我们需要对数据库crud,这里我们简单模拟一下
创建一个接口定义规范
package com.sheng.demo2;
public interface UserServise {
public void add();
public void delect();
public void update();
public void select();
}
创建一个接口实现类
package com.sheng.demo2;
public class UserServiceImpl implements UserServise {
public void add() {
System.out.println("增加了一个用户");
}
public void delect() {
System.out.println("删除了一个用户");
}
public void update() {
System.out.println("修改了一个用户");
}
public void select() {
System.out.println("查询了一个用户");
}
}
创建一个测试类
package com.sheng.demo2;
public class Client {
public static void main(String[] args) {
UserServiceImpl userService=new UserServiceImpl();
userService.add();
userService.select();
userService.update();
userService.delect();
}
}
结果如下:
业务要求,我现在已经实现完毕 。 程序运行的很好,可是不久后,用户或者公司有新的要求,比如说,我要监听你的增删改查啥时候在用的,怎么办?加呗!那么我们增加业务(简单实现一下)。
根据要求,我们对接口的实现类做出修改
package com.sheng.demo2;
public class UserServiceImpl implements UserServise {
public void add() {
System.out.println("使用了add");
System.out.println("增加了一个用户");
}
public void delect() {
System.out.println("使用了delect");
System.out.println("删除了一个用户");
}
public void update() {
System.out.println("使用了update");
System.out.println("修改了一个用户");
}
public void select() {
System.out.println("使用了select");
System.out.println("查询了一个用户");
}
}
好了,老板和用户的业务需求我完成了,
又过了一段时间,老板或者客户又有新的需求了,我要你在用户调用增删改查的时候显示出当前时间(自己随便列的需求),
你听着一乐,按照老办法,在add,delect,update,select中分别加入可以显示当前时间的代码,可是随着时间的推移,业务需求的增多,你发现自己的老办法,好费劲啊,每次增加一个需求我都要在源代码上修改,代码多了,本来我能完整运行的代码,那一天你给我搞崩了咋办。
我问你哈,当年在做一件事情的时候,这个事务越来越多,变得繁忙,你会怎么想,你会想,哎呀,这个时候要是有个人能来帮我办事,我自己不用管多好啊。
再比如啊,你是一家房子的房东,出租房子打了半个月的广告,无人问津,这个时候你想再麻烦自己了,我去找中介,让中介去帮我找客户 ,自己不就舒服了。
那咱们怎么就不能效仿咧,我们来试试
还是
- 定义一个规范化的接口如上的UserService
- 定义一个实现接口类的实例如上的UserServiceImpl
那好,现在老板让你去实现一下,你在增删改查时候的监听,啥时候用的,你一听,怎么又有需求啊,那不行我得找个代理去帮我实现,嘿,好戏来了,那么这个时候代理需要干什么?首先肯定要实现你现有的业务你们共同要实现的,增删改查,然后咧,当然是要代理去实现一个日志啦,啥时候调用的增删改查,这就是你的需求啊,、
那好,定义一个代理类
package com.sheng.demo2;
public class UserServiceProxy implements UserServise{
UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
public void add() {
userService.add();
}
public void delect() {
userService.delect();
}
public void update() {
userService.update();
}
public void select() {
userService.select();
}
}
很明显我们的代理类同样需要实现我们定义的规范化接口,因为这个接口是我们要共同实现的,并且在代理类中我们需要知道一个对象,什么对象?我总得要知道是谁找得代理吧,我要去帮谁实现扩展业务,所有需要UserServiceImpl对象
有了新的需求,那么我们的代理类就要行动了,增加代码如下
package com.sheng.demo2;
public class UserServiceProxy implements UserServise{
UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
public void add() {
log("add");
userService.add();
}
public void delect() {
log("delect");
userService.delect();
}
public void update() {
log("update");
userService.update();
}
public void select() {
log("select");
userService.select();
}
//日志方法
public voi