资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
第11页 / 共30页
第12页 / 共30页
第13页 / 共30页
第14页 / 共30页
第15页 / 共30页
第16页 / 共30页
第17页 / 共30页
第18页 / 共30页
第19页 / 共30页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
单击以编辑母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,设计,API,时要区分其目标用户群,8,第八 章,插,件,件,、,、,客,客,户,户,端,端,程,程,序,序的,区,区,别,别,:,:,插,件,件,:,:插,件,件,是,是,一,一,种,种,遵,遵,循,循,一,一,定,定,规,规,范,范,的,的,应,应,用,用,程,程,序,序,接,接,口,口,编,编,写,写,出,出,来,来,的,的,程,程,序,序,。,。,很,很,多,多,软,软,件,件,都,都,有,有,插,插,件,件,,,,,插,插,件,件,有,有,无,无,数,数,种,种,。,。,例,例,如,如,在,在,IE,中,,,,,安,安,装,装,相,相,关,关,的,的,插,插,件,件,后,后,,,,,WEB,浏,览,览,器,器,能,能,够,够,直,直,接,接,调,调,用,用,插,插,件,件,程,程,序,序,,,,,用,用,于,于,处,处,理,理,特,特,定,定,类,类,型,型,的,的,文,文,件,件,。,。,客户端程序:客户服务(,Customer Service,),是指一种以,客,客户为导向的价,值,值观,它整合及,管,管理在预先设定,的,的最优成本,服务组合中的客,户,户界面的所有要,素,素。广义而言,,任,任何能提高客户,满,满意度的内容都,属,属于客户服务的,范,范围之内。,一些程序功能不,仅,仅可以直接通过,界,界面进行操作,,还,还可以提供相应,的,的,API,以供其他程序来,调,调用,这样第三,方,方程序可以发起,通,通讯,使用相应,程,程序的,API,指使它完成操作,,,,命令执行完后,,,,控制权返回给,调,调用者。,XMMS,的,API,还提供插件支持,,,,第三方可发商,可,可以通过注册“,输,输出插件”来扩,展,展,XMMS,的功能。它,与,与前面说的,客,客户端的地,位,位完全不同,。,。,第三方的播,放,放场,SPI,组成:是与前面,说,说的客户端,的,的地位完全,不,不同。它没,有,有让,XMMS,进行任何操,作,作。但它为,XMMS,增加了很多,功,功能,所以,此,此时的插件,不,不是前文所,说,说的“客户,端,端”。,XMMS,的这种注册,插,插件来扩展,功,功能的方式,是,是,SPI,(,Service Provider Interface,)的典型应,用,用。,Service Provider Interface,为了说明客,户,户端,API,和,SPI,区别,,Voidxmms_play();Void xmms_pause();,Voidxmms_add_to_list(char*);,使用,Java,语言来定义,API,的方式则完,全,全不同。,Public class XMMS Public void play()doPlay();,Public void pause()doPause();,Public void addToPlaylist(String file)do addToPlaylist(file);,8.1C,和,Java,语言中如何,定,定义,API,和,SPI,(,1,),C,和,Java,语言中如何,定,定义,API,和,SPI,(,2,),在,Java,中声明,API,方式有多种,。,。如说可使,用,用,static,方法、实例,方,方法、抽象,方,方法、以及,final,方法,这些,都,都是可以的,。,。但编写一,个,个,SPI,,情况就不,同,同。,如果要使用,C,语言来为,XMMS,编写程序一,个,个插件的话,,,,必须要写,一,一个支持回,放,放的函数,,代,代码如下:,Voidmy_playbackprints(char*text)Printf(“%sn”,text);,InterfacePlayback Public void playback(bytedata);,ClassMyCallbackPrints implements XMMS.Playback,Public void playback(byte data),System.out.println(new String(data);,Xmms.registerPlayback(newMyCallbackPrints();,C,和,Java,语言中如何,定,定义,API,和,SPI,(,3,),对于,Java,程序员,只,要,要所编写的,方,方法不是,private,、,final,或者,static,的,那么就,表,表示该是方,法,法支持调的,,,,而且可以,用,用看成是一,个,个,API,。对很多程,序,序员,甚至,是,是教师都没,有,有清楚地理,解,解这一点,,它,它也的确不,是,是日常编码,的,的内容。,8.2 API,演进不同于,SPI,演进,(1),具体的演进,方,方案则还是,取,取决于具体,的,的接口类型,:,:向,API,中添加一些,内,内容总是可,以,以的,但要,移,移除一些内,容,容则不行。,但对于,SPI,,移除一些,内,内容可以允,许,许,但不允,许,许添加新的,内,内容。建立,契,契约时,必,须,须清楚地区,分,分哪些是,API,,提供给外,面,面调用,而,哪,哪些是,SPI,,用来让外,部,部来扩展程,序,序功能。设,计,计时容易犯,的,的最大错误,就,就是将,API,和,SPI,混在一个类,里,里。根据,SPI,的契约,不,能,能添加方法,,,,根据,API,的契约,也,不,不能减少方,法,法。,8.3 java.io.Write,这个类从,JDK1.4,到,JDK5,的演进,还需要使用,try/catch/finally,的方式来进,行,行防御性编,码,码。,Try,bufferedWrite.append(what);,catch(UnsupportedOpeartionException ex),bufferedWrite.write(what.toString();,这样来调,用,用,API,的确有点,怪,怪。调用,一,一个方法,竟,竟然要写,四,四行代码,java.io.Write,的演进,(2),假设已有,一,一个优化,过,过,Write,类,它无,须,须将数据,转,转换成字,符,符串,而,是,是直接处,理,理以提高,性,性能,但,用,用户却可,能,能无法用,到,到这种梦,寐,寐以求的,优,优化,,Public classCountingWrite extends Write,Privateintcounter;,Public int getcharacterCount(),Return counter;,java.io.Write,的演进,(3),Override,Public voidwrite(charcbuf,int off,int len)throws IoException Counter+=len;,Override,Public Writeappend(CharSepuencecsq)throwsIoExceptionCounter+=csq.length();,Return this;,。,Privatestatic finalclass CDSequence implementsCharSequence Privatefinal int start;Privatefinal int end;,Public CDSequence()This(0,647*1024*1024);,PrivateCDSequence(int start,intend),This.start=start;This.end=end;,Public int length()Return end-start;,CountingWriter writer=new CountingWriter();,CDSequence cdImage=new CDSequence();,BufferedWriter bufferedWriter=new BufferedWriter(writer);,bufferedWriter.append(cdImage);,assertEquals(“Correct number ofwritesdelegated”,cdImage.length(),writer.getCharacterCount();,从,JDK1.4,到,JDK5,的演进(,4,),这个通过覆盖,来,来优化性能的,方,方法却不会被,调,调用,效率仍,然,然没有提高。,If(shouldBufferAsTheSequenceIsNotTooBig(csq)Write(csq.toString();,elseFlush();Out.append(csq);,Returnthis;,从,JDK1.4,到,JDK5,的演进(,5,),首先计算一下,字,字符的数量,,如,如果数量比较,小,小,性能影响,也,也比较小,就,使,使用老的方式,处,处理,否则就,先,先写入当前数,据,据后,再写入,大,大数据。然而,,,,还远远没有,结,结束,还有一,个,个潜在的问题,需,需要解决。,PublicclassCryptoWriter extends BufferedWriter,PublicCryptoWriter(Writer out)Super(out);,Override,Publicvoidwrite(charbuf,int off,int len)throws IoException,Chararr=new charlen;,For(int i=0;ilen;i+),Arri=encryptChar(bufoff+i);,Super.write(arr,0,len);,从,JDK1.4,到,JDK5,的演进,(6),Override,Publicvoidwrite(int c)throws IoException,Super.write(encryptChar);,override,Publicvoidwrite(Stringstr,int off,int len)throws IoException,StringBuffersb=new StringBuffer();,For(int i+0;ilen;I+),Sb.append(encryptChar(str.charAt(off+i);,Super.write(sb.toString(),0,len);,Private charencryptChar(int c),If(c=Z)Return,A;If(c=z)Return a;,Return(char)(c+1);,。,从,JDK1.4,到,JDK5,的演进,(7),事情变得越来,越,越复杂了!为,了,了处理含有大,量,量字符串的对,象,象等目的,最,好,好是直接将数,据,据写入相应的,Writer,对象。,Boolean isOverriden=false;,Try isOverriden=(getClas().getMethod(,“,“write”,String.class,).getDeclaringClass()!=Writer.class)|,(getClass().getMethod(“write”,integer.TYPE).getDeclaringClass!=BufferedWriter.class)|,(getClass().getMethod(“write”,String.class,Integer.TYPE,Integer.TYPE,).getDeclaringClass()!=BufferedWriter.class);,catch(Exceptionex),Throwsnew IoException(ex);,If(isOverriden|shouldBufferAsTheSequenceIsNotTooBig(csq),Write(csq.toStr
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6