代理模式的学习
什么是代理模式?
百度百科: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式中的角色:
真实角色: 实现抽象角色的具体类;
抽象角色: 通过接口或抽象类声明具体的业务方法;
代理角色: 通过代理真实角色实现业务方法;
用生活当中的例子来说,就是当房东想出租房子,但是又不想管太多别的事情,比如办各种手续,这时候房东一般会选择找一个中介帮他做这些事。这时房东就是真实角色,中介是代理角色,而“出租房子”这件事便是抽象角色,这时候客户想要租房子,找的不是房东,而是中介。
代理模式的好处:
先了解代理模式是什么,再了解我们为什么要使用这种设计模式。
通过代理模式,可以减少对原有业务代码的改动,通过横切的方法加入新功能,只要创建一个真实对象的代理,再在代理对象中新增功能即可;
使用代理模式可以在一定程度上让我们的代码解耦;
静态代理:
用代码来实现租房的例子
首先是抽象角色:定义一个接口,包含出租房子这一方法
接着是房东这一真实角色:
然后便是我们的代理角色中介:
中介要实现的还是房东的出租房子方法,
这时候我们来测试一下:
结果如下:
这时候我们便通过代理对象完成了出租房子这一操作;
当然中介自己还得加一些其他的额外操作,比如收中介费,
这时我们再运行:
这时我们就可以很清楚的感受到,要想新增一项业务,我们可以不用改变原来的业务代码,而是新增一个代理角色去实现,当然这样做的弊端就是以后代理的类会越来多;
那么什么是动态代理呢
动态代理:
动态代理和静态代理的区别就是,动态代理的代理角色是通过反射运行时动态生成的,
那么怎么动态生成呢,
在反射包下有个类叫Proxy,Proxy提供用于创建动态代理类和实例的静态方法,就是说,我们通过Proxy中的方法可以动态的生成我们的代理类,再通过InvocationHandler实现原有业务功能并添加新功能。
那么具体怎么来做,
首先还是用原来的房东出租例子,我们的真实角色和抽象角色不变,这是我们需要一个类来帮助我们动态生成代理角色;
根据jdk手册中的例子
我们知道要创建代理角色就要调用Proxy类中的newProxyInstance方法,
实现InvocationHandler接口,并重写Invoke()方法
这时我们这个工具类就写好了,我们在测试中通过它来帮助我们动态生成代理角色并使用业务方法,
运行结果:
以上就是我在学习完秦疆老师的代理模式之后一些总结和理解,代理模式的运用十分广泛,Spring AOP的底层就是通过动态代理来实现,可以横切进去新的业务代码,因此掌握代理模式是很有必要的。
//第一次发博客,努力当一个有思想的程序猿!