代理模式的学习

什么是代理模式?

百度百科: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式中的角色:

真实角色: 实现抽象角色的具体类;

抽象角色: 通过接口或抽象类声明具体的业务方法;

代理角色: 通过代理真实角色实现业务方法;

 

用生活当中的例子来说,就是当房东想出租房子,但是又不想管太多别的事情,比如办各种手续,这时候房东一般会选择找一个中介帮他做这些事。这时房东就是真实角色,中介是代理角色,而“出租房子”这件事便是抽象角色,这时候客户想要租房子,找的不是房东,而是中介。

 

代理模式的好处:

先了解代理模式是什么,再了解我们为什么要使用这种设计模式。

通过代理模式,可以减少对原有业务代码的改动,通过横切的方法加入新功能,只要创建一个真实对象的代理,再在代理对象中新增功能即可;

使用代理模式可以在一定程度上让我们的代码解耦;

 

静态代理:

用代码来实现租房的例子

首先是抽象角色:定义一个接口,包含出租房子这一方法

 

 接着是房东这一真实角色:

 

然后便是我们的代理角色中介:

 

 中介要实现的还是房东的出租房子方法,

这时候我们来测试一下:

 

结果如下:

 

 

这时候我们便通过代理对象完成了出租房子这一操作;

当然中介自己还得加一些其他的额外操作,比如收中介费,

 

 

这时我们再运行:

 

 这时我们就可以很清楚的感受到,要想新增一项业务,我们可以不用改变原来的业务代码,而是新增一个代理角色去实现,当然这样做的弊端就是以后代理的类会越来多;

 

那么什么是动态代理呢

 

动态代理:

动态代理和静态代理的区别就是,动态代理的代理角色是通过反射运行时动态生成的,

那么怎么动态生成呢,

在反射包下有个类叫Proxy,Proxy提供用于创建动态代理类和实例的静态方法,就是说,我们通过Proxy中的方法可以动态的生成我们的代理类,再通过InvocationHandler实现原有业务功能并添加新功能。

 

 

 

 

那么具体怎么来做,

首先还是用原来的房东出租例子,我们的真实角色和抽象角色不变,这是我们需要一个类来帮助我们动态生成代理角色;

根据jdk手册中的例子

 

我们知道要创建代理角色就要调用Proxy类中的newProxyInstance方法,

 实现InvocationHandler接口,并重写Invoke()方法

 

 这时我们这个工具类就写好了,我们在测试中通过它来帮助我们动态生成代理角色并使用业务方法,

 

 

运行结果:

 

 

 以上就是我在学习完秦疆老师的代理模式之后一些总结和理解,代理模式的运用十分广泛,Spring AOP的底层就是通过动态代理来实现,可以横切进去新的业务代码,因此掌握代理模式是很有必要的。

//第一次发博客,努力当一个有思想的程序猿!

 

posted @ 2021-01-02 00:08  rel1fe  阅读(44)  评论(0)    收藏  举报