黑马程序员_关于增强一个类的方法
来源:互联网 发布:ios编程培训入门 编辑:程序博客网 时间:2024/06/07 05:45
----------android培训、java培训、期待与您交流! ----------
我所理解的增强是:给一个已经封装好的类,添加新的功能。
本文所介绍的增强,大致分为两个方法。
第一种,使用装饰设计模式。
第二种,给这个类创建一个代理。
先说说第一种。
假设有这么一个类readFile.class,读取一个指定文本的内容,并打印在控制台上。
readFile.java
import java.io.FileInputStream;import java.io.*;import java.io.IOException;class readFile { public void read(String str)throws IOException{ File file=new File(str); BufferedReader br=new BufferedReader(new FileReader(file)); int x=0; String s=null; int line=1; byte[] arr=new byte[1024]; while((s=br.readLine())!=null){ System.out.println(s); } br.close(); }}
现在当使用这个类的时候,希望计算这个方法运行的时间。
先来说说使用装饰设计模式来实现这个方法。
readByTime.java
class readByTime {read r;readByTime(read r){this.r=r;}public void read(String str)throws Exception{long begin=System.currentTimeMillis();r.read(str);long end=System.currentTimeMillis();System.out.println(end-begin);}}
使用readByTime创建对象时,需要传入一个read的对象,readByTime中的read方法运行时,获取一个毫秒值,然后调用read对象中的read方法,等这个方法运行完毕后,再获取一个毫秒值,最后打印出两个毫秒值之间的差,就得出了程序运行的时间。
实际上,bufferedReader这个类,也是一个装饰设计模式的体现。
再说说使用代理的方式来增强类。
jdk本身的代理有局限性:只能给借口提供代理。
当要给一个实例对象代理时,这个对象就需要实现一个接口,然后用代理接口的方式来代理这个实例对象。
例子:有一个类readFile,其中有个read方法:读取一个文本文件打印到控制台,希望为这个类的方法添加一个计算运行时间的功能。
1.创建一个read接口
read.java
interface read{void read(String str)throws Exception;}
2.创建该接口的实例对象
readFile.java
class readFile implements read{public void read(String str)throws Exception{File fl=new File(str);BufferedReader br=new BufferedReader(new FileReader(fl));String s=null;while((s=br.readLine())!=null){System.out.println(s);}br.close();}}
3.创建readFile对象的代理实现需求的功能
proxy.java
class proxy{public read getReadProxy(){read r=(read)Proxy.newProxyInstance(read.class.getClassLoader(),new Class[]{read.class},new InvocationHandler(){read rd=new readFile();public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{long begin=System.currentTimeMillis();Object ob=method.invoke(rd,args);long end=System.currentTimeMillis();System.out.println("读取文件完成,耗时:"+(end-begin));return ob;}});return r;}}
代理的使用
被代理的对象对于用户来说,是透明的。用户不需要知道被代理对象的方法,只要了解代理的功能。
使用代理时,调用代理类中指定的方法,创建一个对象,该对象就已经具备了扩展的功能。
例如使用proxy.class
class proxyTest {public static void main(String[] args) throws Exception{read r=new proxy().getReadProxy();r.read("d:\\proxyTest.java");}}
总结:
使用 装饰设计模式增强一个类时,需要调用被增强类中的方法。想增强每个方法,就需要在装饰类中为被增强的类中的每个方法定义新的方法。
也就是如果有一个被装饰类,其中有3个方法,定义装饰类时,也需要在装饰类中定义3个方法,分别增强原来的类中的3个方法。
使用代理类时,如果被增强类实现了某个接口,代理类就可以统一的为被增强类添加增强方法,而不需要一一定义。但是代理类的局限性也在于此,如果一个类实现了多个接口,代理类就需要为多个接口分别代理,才能完整的代理被增强的类。
----------android培训、java培训、期待与您交流! ----------
- 黑马程序员_关于增强一个类的方法
- 黑马程序员_关于Response.Redirect()的方法
- 黑马程序员_类方法
- 黑马程序员_增强代码的复用性和匿名对象
- 黑马程序员-java基础增强_常用类
- 黑马程序员_类方法和对象方法的总结
- 黑马程序员_笔记三_关于数组与方法
- 黑马程序员_增强for循环小结
- 黑马程序员_关于object类的学习
- 黑马程序员_关于JAVA常见类的一些总结
- 黑马程序员_关于类本质的小结
- 黑马程序员_关于String的学习
- 黑马程序员_关于集合的学习
- 黑马程序员_关于io的学习
- 黑马程序员_关于反射的学习心得
- 黑马程序员_关于分类的总结
- 黑马程序员_方法
- 黑马程序员_IO输入输出_常用的类和方法
- 双击翻页异常
- android 事件处理机制之requestDisallowInterceptTouchEvent
- 死生과 鬼神-萬物은 神의 分身 (韓長庚 易學原理總論)
- 11.7隐藏和显示吃层
- java处理字符编码的常见问题(最近在弄字符串设置编码写入文件)
- 黑马程序员_关于增强一个类的方法
- 同一台机器启动多个Tomcat的配置
- 解决安卓机不能上网问题
- 二见钟情之个人重构的心路历程
- 【Java】win7 64bit javac 不是内部命令
- Android 开机自启动
- 下载音频
- 用socket实现服务器的编程总结(转载)
- 2013年度总结,工作学习的道路上风雨皆有