黑马程序员_关于增强一个类的方法

来源:互联网 发布: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培训、期待与您交流! ----------

0 0
原创粉丝点击