网站大量收购闲置独家精品文档,联系QQ:2885784924

java Prxy和rtti(反射)实现动态代理工厂.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
java Prxy和rtti(反射)实现动态代理工厂

java 反射实现动态代理工厂 Proxy 场景 有个类【大排档】(Stall),它有个方法“提供饭菜”(providedMeals),就是“来吃饭” 有个类【饭馆】(Restaurant),它有个方法“提供饭菜”(providedMeals) 这两个类有个特点,都是提供吃饭的地方,都有相同的方法“提供饭菜”(providedMeals)。那可以定义一个接口【提供吃的地方】(ProvidedEatOfLocal),它有个抽象方法“提供饭菜”(providedMeals)。用这两个类去实现这个接口。 不管是【大排档】还是【饭馆】,在“提供饭菜”(providedMeals)前要做“点餐”(ordering)的工作,之后要做“埋单”(payMoney)的工作。 那我们在实现【大排档】和【饭馆】的“提供饭菜”(providedMeals)方法时,把这“点餐”(ordering)和“埋单”(payMoney)的代码加在一前一后就可以啦。 问题 但这是重复代码,如果“点餐”的流程发生了改变(比如从人工点餐变成了机器点餐),那每个实现类的方法实现里面都需要改源代码。 现在只有两个实现类,如果现在又新出现个【大酒店】(GrandHotel)类,它也有个方法“提供饭菜”(providedMeals),它也实现接口【提供吃的地方】(ProvidedEatOfLocal)。以后有更多的类都来实现这个接口。实现类越多,那“提供饭菜”(providedMeals)方法的前后工作一发生改变,那修改的类就会越多。这在设计上是不合理的。 解决方案 我们可以考虑代理模式。 我们创建一个代理人【吃货经纪人】(FoodGoodsBroker)。 【吃货经纪人】可以代理所有【提供吃的地方】的实现类,我们只要有和【吃货经纪人】打交道,从他这里我们可以得到我们吃饭的地方去吃饭。吃饭前后的统一动作(【点餐】、【埋单】)这个【吃货经纪人】会处理,实际用餐的人可以不关心啦(难道这就是传说中的吃霸王餐,不给钱?)。 所有实现了【提供吃的地方】的实现类都和【吃货经纪人】打交道,把吃饭前后的统一动作(【点餐】、【埋单】)交给【吃货经纪人】会处理。【点餐】和【埋单】的行为如果有变化就统一变化。如果新来个【提供吃的地方】的实现类也想这么处理,那它也和【吃货经纪人】打交道。 如上所述,实际使用者(用餐的人)是不去关心各种饭店的具体各种的。而新来的饭店如果可要照这么做,也只要和【吃货经纪人】打交道,就能做到统一处理。而这些统一处理的地方如果方法改变,那就都改变,不要去修改每个实现类的具体方法。 这样最累的就是【吃货经纪人】。而提供者(实现了【提供吃的地方】的实现类)和使用者是完全脱离的。完全符合软件设计的开闭原则。 是不是很一横一撇一捺,外带四把X!!! 另外一个场景也能说明这个问题 数据库的操作有增、删、改、查 在做这四个操作前都要开打一个数据库连接 做完操作后都要关闭这个连接 如果开连接和关连接的代码发生改变,那很多的地方都要改变 这时可以用代理,统一处理这些工作 1ProvidedEatOfLocal.java package com.luo.rtti.proxy3; // 定义接口 -- 提供吃饭的地方 public interface ProvidedEatOfLocal { // 抽象方法 -- 提供饭菜 void providedMeals(); } Stall.java package com.luo.rtti.proxy3; // 定义实现类 -- 大排档 实现 提供吃饭的地方 public class Stall implements ProvidedEatOfLocal { // 地方的名字 String local_name = 胖哥大排档; // 实现方法 -- 提供饭菜 public void providedMeals() { System.out.println(马路边...塑料凳...烧烤...砂锅粥...诸葛烤鱼...还有很多吃的...小龙虾); } } Restaurant.java package com.luo.rtti.proxy3; //定义实现类 -- 饭馆 实现 提供吃饭的地方 public class Restaurant implements ProvidedEatOfLocal { // 地方的名字 String local_name = 湘粤情饭馆; // 实现方法 -- 提供饭菜 public void providedMeals() { System.out.println

文档评论(0)

pab547 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档