100%一眼就能理解静态代理模式

案例

  • 房东出租房子,把出租房子看成抽象的行为。
  • 中介代理房子,必定会带客户观看房子,如果客户喜欢,那么会收中介费。
  • 客户租房子。

出租房子行为抽象

//抽象角色:租房
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+"方法");
  }

}

看到这里,所以现在回顾一下:这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
欢迎关注,不易。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值