首页 > 其他 > 详细

【AOP基础学习】代理模式和AOP

时间:2020-03-25 20:48:35      阅读:63      评论:0      收藏:0      [点我收藏+]

1.什么是代理模式

读不懂的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

定义解释:举一个例子,比如生活中租房: 我使用“x如”app,这个房源,我只需要找这个“x如”中介,看房,交钱我不用去找房东,这个中介帮房东把这些事情都做好了。

用代码来解释就是:

(租房子这个动作)

1 public interface Rent {
2     public void rent();
3 }

(房东有房子出租)

房东类:

1 public class Host implements Rent{
2     public void rent()
3     {
4         System.out.println("我有房子出租.");
5     }
6 
7 }

(中介帮房东挂房源)

中介类:

 1 public class Proxy implements Rent{
 2     private Host host;
 3 
 4     public Proxy() {
 5     }
 6 
 7     public Proxy(Host host) {
 8         this.host = host;
 9     }
10 
11     @Override
12     public void rent() {
13         host.rent();
14         inspectHouse();
15         signContract();
16     }
17     public void inspectHouse()
18     {
19         System.out.println("找中介看房子.");
20     }
21     public void signContract()
22     {
23         System.out.println("找中介签合同");
24     }
25 }

(我去租房)

客户类:

1 public class Client {
2     public static void main(String[] args) {
3         Host host = new Host();
4         Proxy proxy = new Proxy(host);
5         proxy.rent();
6     }
7 }

我只需要找租房中介就可以租到想要的房子,我也不知道这个房子是谁的房子,我只需要交钱入住就行。

2.为什么要使用代理模式

  • 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。

    解释:例如,我要租房,但是我找不到房源,所以我就只能去找中介。 而中介和房东都有 租房这一相同接口。他们都是向外租房的。

  • 开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。

  这里就和面向切面编程有一点联系了,一个已经上线的程序,我想修改程序中某个方法的功能,这时候如果直接修改源程序代码,就会产生导致程序崩溃的可能性,这时候,我们可以通过一个代理类来完成这些方法。再像方法中加入我要增加的新功能。

代码示例:

我们要实现增删改查功能,首先定义一个接口。

1 public interface Service {
2     public void add();
3     public void delete();
4     public void update();
5     public void query();
6 }

定义一个实现增删改查接口的 ServiceImpl类。

 1 public class ServiceImpl implements Service{
 2     public void add()
 3     {
 4         System.out.println("增加用户");
 5     }
 6     public void delete()
 7     {
 8         System.out.println("删除用户");
 9     }
10     public void update()
11     {
12         System.out.println("更新用户");
13     }
14     public void query()
15     {
16         System.out.println("查询用户");
17     }
18 
19 }

我们项目已经上线了,这时候,我要给增删改查方法中加入日志功能。此时就不能再在源代码的基础上进行修改了。这样有可能导致程序崩溃。

这时候建立一个代理类。

 1 public class ServiceProxy implements Service {
 2     private ServiceImpl service;
 3 
 4     public void setService(ServiceImpl service) {
 5         this.service = service;
 6     }
 7 
 8     @Override
 9     public void add() {
10         log("add");
11         service.add();
12     }
13 
14     @Override
15     public void delete() {
16         log("delete");
17         service.delete();
18     }
19 
20     @Override
21     public void update(){
22         log("update");
23         service.update();
24     }
25 
26     @Override
27     public void query() {
28         log("query");
29         service.query();
30     }
31     //日志方法
32     public void log(String msg)
33     {
34         System.out.println("使用了"+msg+"方法");
35     }
36 }

我们就可以通过用实现代理类的方法从而达到我们预期的目标。

1 public class Client {
2     public static void main(String[] args) {
3         ServiceImpl service = new ServiceImpl();
4         ServiceProxy proxy = new ServiceProxy();
5         proxy.setService(service);
6 
7         proxy.add();
8     }
9 }

这时候输出结果就为:

技术分享图片

 

增加了一行日志输出效果。这就是所谓的 “开闭原则,增加功能。“

3.动态代理

  • 动态代理类:在程序运行时,通过反射机制动态生成。

  • 动态代理类通常代理接口下的所有类。

  • 动态代理事先不知道要代理的是什么,只有在运行的时候才能确定。

  • 动态代理的调用处理程序必须事先InvocationHandler接口,及使用Proxy类中的newProxyInstance方法动态的创建代理类。

  • Java动态代理只能代理接口,要代理类需要使用第三方的CLIGB等类库。

  该文章通过代码比较详细的介绍了动态代理。

  作者写的非常详细,可以帮助理解动态代理的机制。

  https://blog.csdn.net/zs520ct/article/details/79593196

  动态代理在后续AOP中,有很多的知识点对应,所以需要先理解深刻。再进行AOP学习。

 

【AOP基础学习】代理模式和AOP

原文:https://www.cnblogs.com/Yddd-G/p/12556202.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!