java设计模式自我总结---代理模式

代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介。

Spring 的AOP面向切面就是使用动态代理模式来实现的;

打个比方说:我要买房,但是我对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人(中介)去帮我找,此处的代理就是这个意思。

代理类分为静态代理类和动态代理类:

首先看下静态代理类,代码如下:

接口:

publicinterfaceSource{voidmethod();}

委托类:

/**

* 委托类

*/publicclassRealSubjectimplementsSource{@Overridepublicvoidmethod(){        System.out.println("我要去买房了");    }}

1、静态代理类:

/**

* 静态代理类

*/publicclassProxySubjectimplementsSource{privateRealSubject realSubject;publicProxySubject(){this.realSubject =newRealSubject();    }@Overridepublicvoidmethod(){        before();        realSubject.method();        after();    }voidbefore(){        System.out.println("找房");    }voidafter(){        System.out.println("买房后装修");    }}

测试类:

publicclassText {publicstaticvoidmain(String[] args) {Sourcesource=newProxySubject();source.method();    }}

输出结果:

找房

我要去买房了

买房后装修

静态代理总结:

优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。

缺点:我们得为每一个服务都创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

2、动态代理类

动态代理类中我们不需要手动的创建代理类,我们只需要手动的编写一个动态处理器就可以了,真正的代理对象由JDK在运行时为我们动态的进行创建;

Dynamic代理模式相对于静态代理,大大减少了我们的开发任务,同时减少了对业务接口的依赖,降低了耦合度;

动态代理的实现依靠于InvocationHandler接口和Proxy类来实现的,每一个动态代理类中都必须要实现InvocationHandler接口,该接口中有唯一的invoke()方法;

该方法的作用就是得到一个动态的代理对象,其接收三个参数:

loader:  第一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载interfaces:  第二个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了h:  第三个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

我们来看一下代码:

首先定义一个接口,有两个方法

publicinterfaceSource{voiddescribe();voidbuyHourse();}

给该接口定义一个实现类,其实就是我们的委托对象

publicclassSourceImplimplementsSource{@Overridepublicvoiddescribe(){        System.out.println("中國風");    }@OverridepublicvoidbuyHourse(){        System.out.println("购房");    }}

定义动态代理类,注意一定要实现接口 InvocationHandler

publicclassDynamicProxyimplementsInvocationHandler{/**这个就是要代理的委托对象,使用Object类型,可以代理不同类型的对象,便于复用*/privateObjectsource;/**构造器,给要代理的对象赋值*/publicDynamicProxy(Objectsource) {this.source=source;    }/*

    我的理解:当我们通过动态代理对象调用委托对象的方法时会执行该方法

    */@OverridepublicObject invoke(Object proxy, Method method, Object[] args)throwsThrowable {        before();/*当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用*/method.invoke(source,args);        after();returnnull;    }voidbefore(){        System.out.println("调用对象方法前执行的业务逻辑");    }voidafter(){        System.out.println("调用对象方法后执行的业务逻辑");    }}

测试类

publicclassTest {publicstaticvoidmain(String[] args) {//要代理的真实对象SourcerealSource =newSourceImpl();//创建handler实例,我们要代理哪个对象就把该对象传进去,最后通过该真是对象来调用其方法InvocationHandler handler =newDynamicProxy(realSource);/**

        * 通过Proxy.newProxyInstance方法来创建代理对象,

        * 第一个参数是目标对象的类加载器,获取方法为geiClassLoader()

        * 第二个参数是一个Interface对象的数组,表示的是将要给需要代理的对象提供一组什么借口,

        *    如果我提供了一组接口给它,那么这个代理对象就可以实现该接口(多态),

        *    这样就能调用这组接口中的方法了

        *    这里我们为代理对象提供的接口是真实对象所实行的接口,表示要代理的是该真是对象,

        *    这样就可以调用这组接口中的方法了

        * 第三个参数handler,指定的动态代理处理器,将该动态处理器传入真实的代理对象,即委托类对象

        */Sourcesource= (Source) Proxy.newProxyInstance(Source.class.getClassLoader(),                realSource.getClass().getInterfaces(),handler);source.describe();        System.out.println("");source.buyHourse();    }}

输出结果

调用对象方法前执行的业务逻辑

中國風

调用对象方法后执行的业务逻辑

调用对象方法前执行的业务逻辑

购房

调用对象方法后执行的业务逻辑

如果你想学好JAVA这门技术,也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,8个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,q群号为:180705916 进群免费领取学习资料。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 文章部分内容转载自:http://blog.csdn.net/zhangerqing 一、设计模式的分类 总体来说...
    j_cong阅读 2,065评论 0 20
  • 每个人心里都有个小孩,他好像永远不会长大,在某些时候,他突然就跳出来用大人般的口吻对你说",嘿,该明白点什么了" ...
    布达拉的朝圣阅读 188评论 0 0
  • 都说一场秋雨一场寒,昨天晚上立秋的雨今天一点也没感觉到凉爽,还是闷闷热,由于早上下雨所以我和儿子的晨跑也泡汤了,今...
    刘韩旭妈妈阅读 110评论 0 1
  • 1.C语言 排序算法)(数组的大小排序,字母的先后排序,单词的计数) 2.面向过程和面向对象 面向过程:分析出解决...
    烟雨云渊阅读 158评论 1 1
  • 这是现代C ++,C ++ 17,C ++ 14和C ++ 11的一套核心指南,考虑了未来的增强功能和ISO技术规...
    很优秀的你阅读 494评论 0 0