学习spring前,先了解了解代理模式
什么是代理模式
举个例子,我是一个包租公,我现在想卖房,但是我不想麻烦,每天被电话骚扰,所以这个时候我找了楼下一个中介,让他帮我代理这些事,那么他自然有租房的方法。以后如果有人想租房,直接找中介就行了。
public interface Sale {
public void sale();
}
public class Jiajun implements Sale{
public void sale() {
// TODO 自动生成的方法存根
System.out.println("jiajun要卖房");
}
}
public class SaleProxy implements Sale{
Jiajun jiajun=new Jiajun();
@Override
public void sale() {
// TODO 自动生成的方法存根
jiajun.sale();
}
}
public Client{
public static void main(String[] args)
{
Sale saleProxy=new SaleProxy();
saleProxy.sale();
}
}
为什么用代理模式
从上面的代码可以看出,代理类(SaleProxy)和真实类(Jiajun)好像没什么区别,我直接(new Jiajun().sale())不就行了,那么为什么多次一举呢,任何设计都有他的好处。我们可以发现代理类可以在真实类的基础上增加方法,比如这个时候中介可以收取买主的费用。
public class SaleProxy implements Sale{
Jiajun jiajun=new Jiajun();
@Override
public void sale() {
// TODO 自动生成的方法存根
charge();
jiajun.sale();
}
public void charge()
{
System.out.println("jiajun要卖房,中介要收费");
}
}
而这个不关我事,中介你帮我租出去就行。
什么是动态代理模式
静态代理模式有他的缺点:
- 如果这个时候,我要做的事情增多了,比如我在卖房的时候,我还可以租房。那么我在Sale接口要增加一个方法,真实类(Jiajun)要实现多一个方法,此时代理类(SaleProxy)又要实现多一个方法,如果以后要拓展,会增加很多方法,那么就增加维护难度。
public interface Sale {
public void sale();
public void rent();
}
public class SaleProxy implements Sale{
Jiajun jiajun=new Jiajun();
@Override
public void sale() {
// TODO 自动生成的方法存根
jiajun.sale();
}
public void rent()
{
jiajun.rent();
}
}
- 如果真实类(Jiajun)实现了多个接口,我要为多种方法代理,那么我要手动创建很多代理类。
比如这里我实现了两个接口。
public interface Sale {
public void sale();
}
public interface Buy {
public void buy();
}
public class Jiajun implements Sale,Buy{
public void sale() {
// TODO 自动生成的方法存根
System.out.println("jiajun要卖房");
}
public void buy() {
// TODO 自动生成的方法存根
System.out.println("jiajun要买房");
}
}
这个时候我要生成两个代理,那么我就要创建两个代理类
public class BuyProxy implements Buy{
Jiajun jiajun=new Jiajun();
public void buy() {
// TODO 自动生成的方法存根
jiajun.buy();
}
}
public class SaleProxy implements Sale{
Jiajun jiajun=new Jiajun();
@Override
public void sale() {
// TODO 自动生成的方法存根
jiajun.sale();
}
}
public class Client {
public static void main(String[] args) {
Sale saleProxy=new SaleProxy();
saleProxy.sale();
Buy buyProxy=new BuyProxy();
buyProxy.buy();
}
}
如果我要为多种方法代理,那么就会产生很多代理类。
针对这些缺点,动态代理出现了
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyHandler implements InvocationHandler{
private Object tar;
//绑定委托对象,并返回代理类
public Object bind(Object tar)
{
this.tar=tar;
//绑定该类实现的所有接口,取得代理类
return Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy , Method method , Object[] args)throws Throwable
{
Object result = null;
result = method.invoke(tar,args);
return result;
}
}
public class Client {
public static void main(String[] args) {
ProxyHandler proxy = new ProxyHandler();
//绑定该类实现的所有接口
Sale saleProxy = (Sale) proxy.bind(new Jiajun());
saleProxy.sale();;
Buy buyProxy=(Buy)proxy.bind(new Jiajun());
buyProxy.buy();
}
}
显然,上面的缺点得到解决了。
- 即使接口增加方法,我也不用在代理类再实现一次。
- 即使我要对不同方法做代理,我也不用创建一个代理类文件。
- 动态代理类由Java反射机制动态生成,不用我们自己生成(这里我们并没有看到买房代理类,卖房代理类文件)
- 动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。(我们要买房代理就买房代理,卖房代理就卖房代理,比较灵活)。
- 总的来说,关键的就是我们避免了代理类文件的编写,从而提高了许多便利。
我觉得分享是一种精神,分享是我的乐趣所在,不是说我觉得我讲得一定是对的,我讲得可能很多是不对的,但是我希望我讲的东西是我人生的体验和思考,是给很多人反思,也许给你一秒钟、半秒钟,哪怕说一句话有点道理,引发自己内心的感触,这就是我最大的价值。(这是我喜欢的一句话,也是我写博客的初衷)
学习spring前,先了解了解代理模式的更多相关文章
- 【2016-10-11】【坚持学习】【Day2】【代理模式】
今天学习了代理模式. 定义 官方: 代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. Proxy Pattern: Provide a surrogate or plac ...
- 设计模式C++学习笔记之二(Proxy代理模式)
代理,一看名字就知道这只是个中介而已,真实的执行者在代理的后面呢.cbf4life在他的书里提的例子也很有趣,更详细的内容及说明可以参考原作者博客:cbf4life.cnblogs.com.现在贴 ...
- Spring中常见的设计模式——代理模式
一.代理模式的应用场景 生活中的中介,黄牛,等一系列帮助甲方做事的行为,都是代理模式的体现.代理模式(Proxy Pattern)是指为题对象提供一种代理,以控制对这个对象的访问.代理对象在客户端和目 ...
- Spring增强代理模式
1. 依赖注入;(掌握) 2. XML自动注入;(掌握) 3. 全注解配置;(掌握) 4. 代理模式;(掌握,难点) 依赖注入 构造参数注入 constructor-arg:构造器注入: index: ...
- Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式
Hibernate 延迟加载的代理模式 和 Spring AOP的代理模式 主题 概念 Hibernate 延迟加载的代理模式 Spring AOP的代理模式 区别和联系 静态代理和动态代理 概念 代 ...
- Spring代理模式(jdk动态代理模式)
有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...
- Java设计模式之代理模式(Proxy)
前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...
- Java设计模式之(五)——代理模式
1.什么是代理模式 Provide a surrogate or placeholder for another object to control access to it. Proxy Patte ...
- Java的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...
随机推荐
- JS中的bind的实现以及使用
在讨论bind()方法之前我们先来看一道题目: var altwrite = document.write; altwrite("hello"); //1.以上代码有什么问题 // ...
- (转)Java ConcurrentModificationException异常原因和解决方法
转载自:http://www.cnblogs.com/dolphin0520/p/3933551.html 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会 ...
- 高吞吐koa日志中间件
Midlog中间件 node服务端开发中少不了日志打点,而在koa框架下的日志打点在多进程环境中日志信息往往无法对应上下文,而且在高并发下直接进行写buffer操作(内核调用writev)也会造成内存 ...
- Win10专业版下图片拖到PS无法打开的解决技巧
PS这个软件是用户最常用的软件之一,其强大的图形处理能力毋庸置疑.有用户表示在Win10专业版系统中使用PS发现图片不能直接拖动到PS中打开,这个问题本身不是特别大的问题,但这一小小的毛病会打破用户习 ...
- hive的安装和升级
目录 [toc] 安装 升级 安装 nohup hive –service hiveserver & 启动: sudo nohup ./hive --service metastore &am ...
- JSON的数据类型
数据类型简介 在计算机中,我们需要知道正在处理什么类型的数据,因为不同类型的数据有着不同的操作途径.可以让两个阿拉伯数字相乘,但是不能让两个单词相乘. 在计算机科学中,有一种数据类型被称为原始数据类型 ...
- 第三人称角色移动及自由移动视野(RigidBody实现)
重点:向量的运算.在获得水平及垂直方向的速度之后,将方向进行重设,让方向与视野同步(即:相机的方向与人物方向相同) 下面以一个实例来说明如何操作: 1.如图创建一个地形(Terrain),两个正方体( ...
- 因为文件组 'PRIMARY' 已满 解决办法
简介:文件组 'PRIMARY' 已满 一般虚拟主机提供商是通过限制数据库文件的大小来实现提供定制的数据库空间的.当你把从虚拟数据库空间备份下来的文件恢复到自己的服务器上时,这个限制还是存在的.找到数 ...
- 分享一个随机更改 MAC地址 软件
有些软件 是根据 MAC地址 来判断 是不是 已经 安装过 这个 软件 (针对 有些软件是 可以 免费 使用的 ) 要想 一直 使用 的话 只需要 修改一下 mac地址 就可以 继续 使用! 在百度中 ...
- 一文读懂 HTTP/2 特性
HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议.由互联网工程任务组(IETF)的 Hypertext Transfer Protocol ...