做者 : Stanley 罗昊html
【转载请注明出处和署名,谢谢!】java
写在前面:*此章内容比较抽象,因此须要结合实际操做进行讲解*设计模式
*须要有必定的java面向对象基础*测试
首先,咱们须要创建一个java工程来实现一个例子,从而理解什么是java中的静态代理;spa
建好项目后,咱们须要在项目中新建一个包,而后在包下建一个接口,人的接口(Person),紧接着呢,咱们在接口中建立一个吃饭的方法:设计
这个方法就被称之为抽象方法,接下来呢,我将会去写一个实现类,它们分别是,老师(Teacher)实现类,紧接着,咱们须要让这个类实现Person这个接口,并实现Person类中定义好的抽象方法:3d
而且在改方法中输出一句话,来表示这个方法的所执行的意义;代理
接下来呢,我再定义一个学生(Student)类,并全也去实现人类(Person),而且实现该类中的方法:指针
以上都建立完毕以后呢,咱们来创建一个测试类,将Student类实例化,调用学生吃零食这个方法:htm
打印结果就是 学生在吃零食。。。。。;
一样的,咱们将老师类也在测试类中实例化,而且调用老师吃饭方法,那么打印结果就是:
学生在吃零食。。。。。。
老师在吃饭。。。。。。
完成以上步骤以后呢,如今咱们的需求忽然要求加强;
需求变化:不管是老师仍是学生,我都须要让他们在吃饭以前先跑一圈,吃饭以后,再去跑一圈;
咱们的需求发生了这样的一个变化,你该如何实现呢?下面我列出几个实现的策略:
这个就很好实现,好比,我如今要把学生类根据以上要求加强,咱们只须要去实现类中修改原方法便可:
如今,咱们再运行Test这个类看效果:
这种结果,是否是就是根据以上需求进行加强了;
注:可是,这种方式,很是不提倡使用,由于,实际开发中通常不会去修改以及提交的代码,
由于你提交完成以后,别的小组就会调用你的这行代码,因此,在实际开发当中,咱们不会轻易的去修改原始代码;
代理主要做用:
来作一些须要加强的事情;
举例:这个代理,就相似于,明星的经纪人。
咱们假设如今有一个演员王宝强,王宝强的经纪人是谁啊----------宋喆对吧;
王宝强最先出道的时候仅仅是一个小演员,小演员的时候,没有经纪人,因此他只负责跑龙套就好了,跑龙套对他来讲是彻底能够应付过来的,可是随着他愈来愈火,他已经不是演戏那么简单了,他除了演戏,他还须要拍广告、还须要宣传,这些都须要他干对把,
演戏是否是须要他一我的去接戏啊,接广告的话,是否是还须要去谈这个广告啊,若是他只身一人的话,他还须要去接戏、接广告、接宣传,由于考虑到他经历有限,是否是这些工做他一我的是没法独自完成的;
这个时候呢,王宝强就想到了一个办法,请一个代理,也就是咱们所谓的经纪人;
经纪人干的活就是王宝强能够不亲自去干的活,而王宝强的核心业务是否是仅仅的去拍戏便可,一个经纪人能够有经纪多个演员;
这个代理,是否是就相似于上面我所述的经纪人
被代理,是否是就是王宝强
刚才,咱们用了第一种方式来实现了对需求进行了加强,很显然,这样作是不对的,在实际开发中,企业里也不容许这样去作,因此咱们把刚才写的那几句打印输出语句给删掉;
那,接下来就改变一下需求:
学生在吃饭以前,须要买饭,吃完饭后须要扔垃圾
从以上需求,咱们大概能分析出来,吃饭是学生的核心,然而扔垃圾、买饭,是否是就是找一个经纪人就好了;
因此接下来,咱们就给学生找一个代理;
1.首先,咱们须要建一个类(ProxyStudent)
2.那么ProxyStudent既然是学生的代理类,那么就必需要有跟学生同样的功能,另外辅助的功能后续再添加;
刚才学生类实现了一个接口(Person),那么它的代理类,也必需要去实现Person,吃饭的方法实际上仍是学生在作,
这里的核心功能依然是学生本身的,底层调用的仍是学生本身的,也就是在个人这个代理对象中的吃饭这个方法里面你必须去调用学生的;
既然须要在代理对象中,须要去调用学生吃饭的方法,那这个代理对象(ProxyStudent)的代理类中,是否是就须要有学生的属性:
若是直接使用s.,执行必然是空指针异常,因此,咱们须要给这个学生对象使用构造器进行初始化;
那么接下来,咱们再须要进行加强,咱们是否是仅须要在s.chifan();方法先后添加就行啦;
这样以来,是否是就是对原始的方法进行了一次加强;
接下来,我再写一个测试类(ProxyTest),进行测试;
那么在测试类中,咱们仅须要调用代理对象便可,也就是说直接找宋喆,别再去找王宝强了,就是这样意思.....
实例化代理对象以后,我是否是就能够经过代理对象去调用个人吃饭方法啦;
来看下执行结果:
是否是代理帮我买大餐,我只负责吃饭,代理帮我扔垃圾;
那么经过这样的一个手段就实现了一个代理;
那么,在以上的这个代理类中,真正的核心方法仍是被代理对象的,你这个吃饭的这个核心方法是否是就是吃零食啊;
学生正在吃零食是否是就是调用学生的,另外两个是我本身拓展加上去的对吧;
而其余的辅助的方法,是否是就算是代理去作了;
1.和被代理对象实现相同的接口
2.在代理类中,须要对被代理对象初始化
3.须要实现和被dialing对象相同的方法,而且在这个方法中核心(原始)业务调用被代理对象的,加强的业务在这里进行加强就好了
静态代理方式是有缺陷的;
1.若是有不少个对象须要找代理,那么就须要实现不少个对象的代理类,这样的话代码臃肿,用户体验很通常;
2.若是被代理的方法过多,每一个方法都须要加强,代码不整洁,大量搬用的工做
它有这两大缺陷就形成了写大型项目的时候,就不会用静态代理这个设计模式
原文出处:https://www.cnblogs.com/StanleyBlogs/p/10761604.html