代理模式(静态代理)的通俗理解
来源:互联网 发布:sql关联表查询 编辑:程序博客网 时间:2024/05/17 22:40
代理模式分为两种:静态代理和动态代理。
首先不谈模式,举一个例子:
有一队很美丽的妹子,她们都是训练有素的迎宾小姐。平时忙于训练再加上人脉与广告投入不多,生意并不好。于是她们的老大提议去找一个礼仪公司合作,请他们把迎宾的活儿包给她们来做。恰好在某个公司有个接待外宾的活动,该活动交给一个这个知名的礼仪公司负责,礼仪公司就通知了迎宾小姐。在外宾下车时就要乐队奏乐,走到公司门口时,迎宾小姐需要致以问候。现在来模拟一下这个情景。
可是事情进展的并不顺利,突然听说这些个外宾都会中文,而且其中的重量级人物很喜欢中国传统文化。于是该公司要求礼仪公司立即换掉迎宾小姐,请一队着汉服而且普通话好的来。幸好该队迎宾小姐都是狠角色,各种场面都能应付。
于是我们做如下修改:
迎宾队伍的老大又想,这样太麻烦了,每次换来换去的折腾不起,倒不如我们再召些人马,加强多元化的训练,使自己的团队能应付各种场面,然后根据需求迅速做出响应。
修改代理类:
修改后的代码可以说是一个静态代理了,设计模式提倡针对接口编程,而不是针对实现编程,这样可以灵活多变。最开始的代码可以说是一种代理,但不是一种模式,模式讲究的是良好的设计,如果进一步强调通用性和可扩展性,那就不得不提到JDK和cglib的动态代理。
从上面来总结一下静态代理:
有些类由于自己功能有限,需要其他的类做一些工作来辅助完成某些功能,虽然这些辅助工作是必须的,但是委托类却不需要自己去做,一是他没有资源,二是它应该注重自己擅长的事情。这样一些代理类应运而生,它专门做一些事前和善后的处理,让委托类专注于自己的事情。在生活中有很多这样的例子,就像上面的迎宾团队,它的团队训练有素,能力很强,但是它却没有能力去接一些大活儿,这样他可以去找礼仪公司,两者签订合作协议,让礼仪公司出去接活儿,迎宾部分到时候包给该团队去做,这样各得其所。还有就是常常在幕后为明星忙碌的经纪人,他们就是活生生的代理。
回到我们程序员的世界,看看那些有名的框架,像struts2中的action调用,hibernate的懒加载,spring的AOP,无不用到了代理模式,虽然不再是简单的静态代理,但是思想大抵如此。我们使用这些框架时,只需要专注自己的业务逻辑部分,其他重复机械的但不得不做的工作交给了这些幕后英雄。
我的总结:接口由不同的功能类实现,然后在所谓的动态代理实现类中,有这个接口的对象。需要哪个功能就new 哪个功能类。
interface A{
public void a_method();
}
class B implements A{
public void a_method(){
sysout("b的实现");
}
}
class C implements A{
public void a_method(){
sysout("c的实现");
}
}
class Static_proxy implements A{
private A a=new B();
public void a_method(){
sysout("111111111111111");
a.a_method();
sysout("22222222222222");
}
}
在main(客户端)中,new 一个static_proxy类,直接调用方法。
main(){
Static_proxy s_proxy=new Static_proxy();
s_proxy.a_method();
}
但是这样 一旦需要改变调用的对象(比如原来用的b现在用的c)就不得不
在static_proxy中改,private a=new b;这句。这样显得很愚蠢。
因此重新设计static_proxy类并且为其设置一个有参构造方法,在该构造方法中将需要调用的对象确定:
public class Static_proxy implements A{
private A a;
public static_proxy(A a){
this.a=a;
}
public void a_method(){
sysout("111111111111111");//加一些别的东西
a.a_method();
sysout("22222222222222");
}
}
客户端:main(){Static_proxy s_proxy=new Static_proxy(new B());
s_proxy.a_method();
}
这样明显优雅很多。
- 代理模式(静态代理)的通俗理解
- 代理模式(静态代理)的通俗理解
- 动态代理的通俗理解
- 代理模式-静态代理
- 代理模式-静态代理
- 代理模式--静态代理
- 代理模式-静态代理
- 代理模式--静态代理
- 静态代理和动态代理的理解
- 代理模式的理解
- 代理模式的理解
- (静态代理模式)代理类的作用
- GOF23代理模式之静态代理模式理解之经典
- 正向代理与反向代理通俗理解
- 代理模式的再理解--动态代理
- (转)用通俗的例子来理解代理设计模式
- java代理模式的学习(动态代理+静态代理)
- 代理模式 静态代理和动态代理的区别
- windows下面安装easy_install和pip教程
- frameset标签设计页面
- java并发编程学习(3)
- 31. Next Permutation
- 关于javaScript switch 使用心得
- 代理模式(静态代理)的通俗理解
- [算法系列之十八]海量数据处理之BitMap
- Servlet 与 Ajax 交互一直报status=parsererror
- mysql的四种隔离级别
- 树莓派配置之换源
- Linux文件编程之遍历目录
- 面向对象-代码块看程序写结果
- linux下使用tcpdump
- Gradle入门之安装(一)