案例
- 房东出租房子,把出租房子看成抽象的行为。
- 中介代理房子,必定会带客户观看房子,如果客户喜欢,那么会收中介费。
- 客户租房子。
出租房子行为抽象
//抽象角色:租房
public interface Rent {
public void rent();
}
房东出租房子
//真实角色: 房东,房东要出租房子
public class Host implements Rent{
public void rent() {
System.out.println("房屋出租");
}
}
代理的房子是由房东出租的,记住本质还是房东出租房子,而代理做的事不过是带客户去看房子,收中介费。
//代理角色:中介
public class Proxy implements Rent {
// 我想看到这里的时候,你应该明白的一件事就是
// 房东出租房子,如果不出租房子.中介就不能出售房子
// 因此要传一个host,并且初始化的时候,就要把房东出售房子,这个行为之前就有了
// 特别强调的一点是!!!!房东要出售房子
private Host host;
public Proxy() { }
public Proxy(Host host) {
this.host = host;
}
//租房
// 这里记住中介干的事是带房客去参观,收费。
// 到现在,你应该明白了房子出租本质还是房东
public void rent(){
seeHouse();
host.rent();
fare();
}
//看房
public void seeHouse(){
System.out.println("带房客看房");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
}
那么看完上面的,我们进一步理解AOP,面向切向编程的概念**这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。**看不懂的话很正常,再举一个案例。
- 案例增删改查
抽象行为增删改查
//抽象角色:增删改查业务
public interface UserService {
void add();
void delete();
void update();
void query();
}
真实对象,完成增删改查操作的人
//真实对象,完成增删改查操作的人
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("增加了一个用户");
}
public void delete() {
System.out.println("删除了一个用户");
}
public void update() {
System.out.println("更新了一个用户");
}
public void query() {
System.out.println("查询了一个用户");
}
}
现在我们需要做一个修改,就是在每一个方法之前增加一个日志输出,在之前实现类上增加方法,很麻烦,因此想到之前的方法就是代理。
增加一个代理日志类
public class UserServiceProxy implements UserService {
// 我们需要之前的方法
private UserServiceImpl userService;
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
public void add() {
log("add");
userService.add();
}
public void delete() {
log("delete");
userService.delete();
}
public void update() {
log("update");
userService.update();
}
public void query() {
log("query");
userService.query();
}
public void log(String msg){
System.out.println("执行了"+msg+"方法");
}
}
看到这里,所以现在回顾一下:这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
欢迎关注,不易。