一、代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与委托类有同样的接口。
举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。
二、为什么要使用代理模式?
(一)中介隔离的作用
在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
(二)开闭原则,增加功能
代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
针对一个方法,可以增强的部分有:
1、增强参数
2、增强方法体
3、增强返回值
三、代理的分类
我们有多种不同的方式来实现代理。
如果按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。
1、静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
2、动态代理:在程序运行时通过反射机制在内存中动态地创建代理对象。
四、静态代理
步骤:
1、创建一个接口
2、创建一个被代理类,实现该接口
3、创建一个代理类,实现接口
用静态代理实现购买二手车
1 | /** |
1 | /** |
1 | /** |
编写测试类
1 | /** |
测试结果如下:
静态代理总结:
优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
我们已经总结发现每一个代理类只能为一个接口服务,一个Audi类实现了一个SellCar接口,那么我要是有多个接口,是不是要写多个Proxy类与之对应。这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那就引入了我们的动态代理了。
参考自:
谈谈JAVA的代理模式认识 一——为什么使用代理模式
设计模式—代理模式
Java新手,若有错误,欢迎指正!