java设计模式之代理模式 ,以及和java 回调机制的区别
- java 代理模式就是:
将自己要做的事交给别人去做(这个别人就是代理者,自己就是被代理者),为什么自己能做的要交给别人去做了?假如一个小学生小明,现在要写作业,但是又想玩游戏,他更想玩游戏,并且不想被妈妈骂,所有他找了个天才枪手,小红给他代写作业,自己再去把作业交给妈妈检查。小明妈妈看见是小明交的作业,也就没怀疑不是他自己的做的。目的达到了,过程就不那么重要了(当然不是不对的了,这里只是为了讲述设计模式而模拟的某种场景)。
2.代理模式要点:
1.一个抽象的主题(这里抽象的主题就是写作业)
2.一个代理者(小红),继承抽象主题(写作业)
3.一个被代理者(小明),继承抽象主题(写作业)
4.一个管理者继承抽象主题,一个被代理者对象(3 和 4 可以任选一个,3 是将被代理者和管理者合并成一个 ,4 是将被代理者 和 管理者分开)
3.代理模式的应用:spring AOP 面相切面编程,例如事物的管理委托给spring 容器去管理,程序员只用关系核心业务层,高度复用的模块交给代理者去做,不用重复的工作。增加系统的代码冗余。
代码:
抽象主题
package javadesign.staticProxy; /**
* Created by Administrator on 2017/12/21.
*
* 概念:某项任务要交给对象A完成,C又把A 的任务交给了B去做,A就是被代理者,B就是代理者,C 就是委托人
*
* 实现:创建一个代理的主题,代理者和被代理者都继承这个类并且,实现主题
* 为什么代理类和被代理类都要实现这个?现在有个做作业的任务,抽象出来一个做作业的主题。
*
* 场景 :一天小明的妈妈让小明做作业,首先小明得接受做作业这个任务,所以他继承做作业这个主题,
* 但是小明想打游戏,作业还必须得完成,他找到一个瞒天过海的方法,让小红去做作业,但是还要伪装成自己的做的,
* 所以小红也得继承做作业这个主题
*
* 效果:小红 和 小明 都是调用同一个做作业名称,小明妈妈傻傻分不清楚,到底是谁做的作业(真正是小红做的,只是小明妈妈不知道),
* 这就达到了代理的目的
*
*/
public interface ProxyWork { public void doHomeWork();
}
被代理者(or 委托者)
package javadesign.staticProxy; import org.junit.Test; /**
* Created by Administrator on 2017/12/21.
* 创建一个代理的管理者,将要代理的任务分配给真正的处理任务的类,就是小明把自己的作业交给小红学霸做啦
*/
public class ProxyManager implements ProxyWork {
private ProxyWork proxyWork; /*
* 这个方法是设置代理的方法,运用到了java 多态的思想
* */
public void setAgency(ProxyWork proxyWork){
this.proxyWork=proxyWork; // 这个方法是将真正的代理类(小红)作为参数传递给
} @Override
public void doHomeWork() {
System.out.println("小明开始假装做作业");
//其实小明没有做作业,而是叫来小红,让小红去做
if(this.proxyWork!=null){ //先判断小红的引用是否传递过来
proxyWork.doHomeWork(); //这里小红开始做作业,实施瞒天过海大计的关键一步
}
System.out.println("小明告诉妈妈,作业完成了");
} /*
* 开始测试代理,模拟一个场景
*
* */
@Test
public void client(){
ProxyManager proxyManager=new ProxyManager();
proxyManager.setAgency(new ProxyRealWork()); //new ProxyRealWork 创建一个名叫小红的代理者
proxyManager.doHomeWork(); //小明开始假装做作业,真正做作业的是小红
} }
代理者:
package javadesign.staticProxy; /**
* Created by Administrator on 2017/12/21.
*/
public class ProxyRealWork implements ProxyWork { private ProxyWork proxyWork; //将被代理者,也就是游戏小王子小明传递过来,其实也就是java 的多态 //这里传入被代理者,用到了多态
public void setAgency(ProxyWork proxyWork){ //这里将会传入实例化的小明
this.proxyWork=proxyWork;
} /*
这个代理者是真正做作业的人,也即是小红这个学霸
*/
@Override
public void doHomeWork() {
this.before();
//这个位置也就是相当于Spring Aop 切点的位置service 层
System.out.println(" 真正的任务执行者,正在执行任务,也就是小红做作业啦");
this.after();
} /*
* 这里的预处理和善后处理类似于Spring的面向切面编程,具体的实现有事务管理,日志等
* */ //预处理动作
private void before(){
//TODO
System.out.println(" 小红预温习了功课,然后开始做作业");
} //善后处理
private void after(){
//TODO
System.out.println(" 小红把做完的作业又检查了一遍,不能做的全对,不然太假了");
}
}
代理模式和回调模式的区别:
本人认为两者是相同的,都是同一种思想(自己的事情交给别人做,自己发出命令),若更加严格的区分,也是两种思想(一个强调代理,一个强调回调),若要真的找不同,那就从他们具体的实现方式(代理模式:追求主题的统一,发出命令,各谋其事;回调机制:追求通知,发出命令,接受通知)
注释:本文中的代理模式是静态代理,耦合性很高,在项目中可能很少用,所以项目中要开发通用的代理就要利用反射机制,实现动态代理。(例如 小红 要帮小明,小张,小王三个人写作业,他们的作业本的要分别对应他们三个人,不能只对应某个人)
注明:本文原创,可以转载,可以评论,有不对的地方欢迎指正,在别的地方看到类似的文章,不喜勿喷,只是自己加深理解写的文章 。
java设计模式之代理模式 ,以及和java 回调机制的区别的更多相关文章
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- java设计模式6——代理模式
java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...
- Java设计模式:代理模式(转)
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...
- Java 设计模式_代理模式(2016-08-19)
概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- JAVA设计模式:代理模式&& 装饰模式区别
在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解: 装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖. public in ...
- Java设计模式:代理模式(二)
承接上文 三.计数代理 计数代理的应用场景是:当客户程序需要在调用服务提供者对象的方法之前或之后执行日志或者计数等额外功能时,就可以用到技术代理模式.计数代理模式并不是把额外操作的代码直接添加到原服务 ...
- Java设计模式之代理模式(Proxy)
前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...
- Java设计模式 之 代理模式
所谓的代理模式就是为其它类或对象提供一个代理以控制对这个对象的访问.那么常见的代理有远程代理,虚拟代理,保护代理,智能代理. 1. 远程代理:为一个不同地址空间的对象提供一个本地代理对象. 2. 虚拟 ...
随机推荐
- c++学习笔记之基础---类内声明线程函数的调用
近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter.编译之后报错如下: spf ...
- mysql14---手动备份
PHP定时完成数据库的备份 1.手动备份数据库(表的)方法 cmd控制台(windows指令): mysqldump –u root –proot 数据库 [表名1 表名2..] > 文件路径 ...
- Linux设备驱动--块设备(四)之“自造请求”
前面, 我们已经讨论了内核所作的在队列中优化请求顺序的工作; 这个工作包括排列请求和, 或许, 甚至延迟队列来允许一个预期的请求到达. 这些技术在处理一个真正的旋转的磁盘驱动器时有助于系统的性能. 但 ...
- UVA10462Is There A Second Way Left? —— 次小生成树 kruskal算法
题目链接:https://vjudge.net/problem/UVA-10462 Nasa, being the most talented programmer of his time, can’ ...
- YTU 1004: 1、2、3、4、5...
1004: 1.2.3.4.5... 时间限制: 1000 Sec 内存限制: 64 MB 提交: 1275 解决: 343 题目描述 浙江工商大学校园里绿树成荫,环境非常舒适,因此也引来一批动物 ...
- bootstrap3.0学习笔记记录1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- maven目录结构介绍篇
bin 该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath喝相关的java系统属性 mvn是基于UNIX平台shell脚本,mvn.bat是基于Windows平台的 ...
- 整型变量修饰符,char类型数据存储原理,字节数,
//------------------整型变量修饰符 修饰符(int short long longlong signed unsigned)所有修饰符都是用来修整形 int 4short %hd ...
- 初探js闭包
1.变量的作用域:全局变量.局部变量 函数内部可以直接读取局部变量 js代码 var n=2; function fun(){ alert(n); } fun(); //2 函数外部不能读取函数内部 ...
- MySQL之不得不说的keepsync和trysync
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 开宗明义,keepsync和trysync是网易MySQL分支版本InnoSQL的两个参数,非常重要的两个参 ...