java之Spring(AOP)前奏-动态代理设计模式(上)
我们常常会遇到这样的事,项目经理让你为一个功能类再加一个功能A,然后你加班为这个类加上了功能A;
过了两天又来了新需求,再在A功能后面加上一个新功能B,你加班写好了这个功能B,加在了A后面;又过
了几天天,项目经理说这两个新加的功能顺序需要调换一下,然后你找到一个礼拜之前的写的源代码,看了
一遍想起来当时是怎么实现的了,这部分是功能A,那部分是功能B,然后巴拉巴拉换了顺序。看到这是不是
觉得很烦,动不动就要在源码上加新功能,完了又要在源码上换新功能的顺序,那么一大坨源码,还好是自
己写的源码,理解起来很快,操作起来也很快,万一是别人的源码,别人的编程习惯可能和自己的不一样,
看他的源码,又要多花点时间,真是卷铺盖走人的心都有了。
这个时候,我们就可以用代理来为源码有序地添加新功能。
1.定义一个接口
public interface InterfaceDo {
public void dosomething();
}
2.定义原始功能类
public class Persontodo implements InterfaceDo {
public void dosomething() {
System.out.println("要干什么呢--------");
}
}
我们可以看到,这个类实现了之前的接口, 但是只做一件事:思考人生!
3.定义额外功能类,并实现对原始功能的调用
public class Impeat implements InterfaceDo {
private InterfaceDo todo;
public Impeat(InterfaceDo todo) {
super();
this.todo = todo;
}
public void dosomething() {
todo.dosomething();
System.out.println("我要吃饭了啊--------");
}
}
我们看到这个类引入了一个成员变量,类型为InterfaceDo(接口)类型,
构造函数实现为成员变量赋值,那么当我们实例化这个类的时候,它内部的成员变量是指向传入的参数对象的实例的。
Persontodo a = new Persontodo();
Impeat b = new Impeat(a);
那么,b.dosomething()这个方法实现的功能是:先执行实例化时候传进来的参数todo的todo.dosomething()方法,然后
再执行语句System.out.println("我要吃饭了啊------------");
在上面的例子由于传进来的参数是a,那么b.dosomething()就同等于以下两步操作:
①a.dosomething();
②System.out..println("我要吃饭了啊------------");
结果控制台打印输出:
要干什么呢--------
我要吃饭了啊---------
弄懂之后我们再来新建个Impeat这样的类,同样是实现InterfaceDo接口
public class Impgame implements InterfaceDo {
private InterfaceDo todo;
public Impgame(InterfaceDo todo) {
super();
this.todo = todo;
}
public void dosomething() {
System.out.println("我要玩游戏了啊--------");
todo.dosomething();
}
}
上面接口实现类的含参构造函数的参数是InterfaceDo(接口)类型,所以参数可以是该接口所有实现类的实例化对象。
4.多态的运用
public class Testperson {
public static void main(String[] args) {
Persontodo a = new Persontodo();
Impeat c = new Impeat(a);
Impgame d = new Impgame(c);
Impsleep b = new Impsleep(d);
b.dosomething();
}
}
我们可以看到这个测试类,将原始功能类的实例化对象作为参数传给Impeat的含参构造器,然后将Impeat的实例化对象
作为参数传给Impgame的含参构造器,再将Impgame的实例化对象作为参数传给Impsleep的含参构造器,最后调用了
Impgame的实例化对象的dosomething()方法。
那么,实际上这个方法是:
先调用参数的dosomething()方法然后打印一条语句,而参数的dosomething()方法也是
先调用参数的dosomething()方法然后打印一条语句,如此循环,可以用一张图表示。
-----------------------------------------------------------------------------

-----------------------------------------------------------------------------
每个框都是一个类,当然新增功能顺序可以自由选择,你也可以先实现功能2在实现1。
如此一来每个除原始功能类之外的功能类,都是具备往其他功能类上添加功能的能力的。
由于上面所有的类都是实现InterfaceDo接口的,那么可以将上面的代码改写一下:
public class Testperson {
public static void main(String[] args) {
InterfaceDo a = new Persontodo();
InterfaceDo c = new Impeat(a);
InterfaceDo d = new Impgame(c);
InterfaceDo b = new Impsleep(d);
b.dosomething();
}
}
不难看出,这就是引用多态,接口的引用指向实现类的对象。
c在a的功能基础上添加了功能;
d在c的功能基础上添加了功能;
b在d的功能基础上添加了功能。
这就实现了静态代理。
java之Spring(AOP)前奏-动态代理设计模式(上)的更多相关文章
- Spring AOP 前奏--动态代理
- Spring AOP 和 动态代理技术
AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情 ...
- Spring AOP --JDK动态代理方式
我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinit ...
- java之Spring(AOP)前奏-动态代理设计模式(下)
在上一章我们看到了,新增的三种类都能实现对原始功能类进行添加功能的事务处理,这三种类就是一个代理. 但是这种代理是写死的,怎样实现对任意接口添加自定义的代理呢? 我们先来看一下之前的代理实现: pub ...
- Spring AOP之动态代理
软件151 李飞瑶 一.Spring 动态代理中的基本概念 1.关注点(concern) 一个关注点可以是一个特定的问题,概念.或者应用程序的兴趣点.总而言之,应用程序必须达到一个目标 ...
- Spring AOP JDK动态代理与CGLib动态代理区别
静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分 ...
- spring基础概念AOP与动态代理理解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...
- AOP jdk动态代理
一: jdk动态代理是Spring AOP默认的代理方法.要求 被代理类要实现接口,只有接口里的方法才能被代理,主要步骤是先创建接口,接口里创建要被代理的方法,然后定义一个实现类实现该接口,接着将被代 ...
随机推荐
- Swing——动作(Action)
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41258997 Action接口扩展于ActionListe ...
- C语言实现万年历
给出你想知道的年份,便可以计算出该年对应的每个月每个日所对应的星期数,是不是感觉很好玩 ? #include <stdio.h> #include<stdlib.h> long ...
- PHP中关于foreach的简单的用法总结
在php中使用循环方式输出数组里面的内容有好多种方式,我们既可以采用数组迭代循环的方式,当然也可以采用下面的foreach方法,日常开发中用到的最多就是它.下面我们就先看一下它的用法吧: //语法是: ...
- Asp.net中JQuery、ajax调用后台方法总结
通过上一篇文章实例的实现,整个过程当中学习到很多知识点,了解了Jquery.Ajax在asp.net中的运用,加以总结,其实原理都是一样的,理解了一种,其他的注意很少的区别就可以了.灵活运用: 1.有 ...
- 开源库BaseRecyclerViewAdapterHelper
相信大家RecyclerView应该不会陌生,大多数开发者应该都使用上它了,它也是google推荐替换ListView的控件,但是用过它的同学应该都知道它在某些方面并没有ListView使用起来方便, ...
- Stochastic Gradient Descent 随机梯度下降法-R实现
随机梯度下降法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 批量梯度下降法在权值更新前对所有样本汇总 ...
- [转]ubuntu安装vncserver实现图形化访问
请注意: 如果在安装中部分软件无法安装成功,说明软件源中缺包,先尝试使用命令#apt-get update更新软件源后尝试安装.如果还是不行,需要更换软件源.更换步骤: 1)输入命令#cp /et ...
- 关于App启动加载广告页面思路
需求 很多app(如淘宝.美团等)在启动图加载完毕后,还会显示几秒的广告,一般都有个跳过按钮可以跳过这个广告,有的app在点击广告页之后还会进入一个广告页面,点击返回进入首页.虽然说这个广告页面对用户 ...
- 标准会话对象——StandardSession
Tomcat使用了一个StandardSession对象用来表示标准的会话结构,用来封装需要存储的状态信息.标准会话对象StandardSession实现了Session.Serializable.H ...
- BASE64Decoder小解
BASE64Decoder小解 Base64 是网络上最常见的用于传输8Bit 字节代码的编码方式之一,大家可以查看RFC2045 -RFC2049 ,上面有MIME 的详细规范. Base64 要求 ...