JavaScript设计模式之接口.docx
《JavaScript设计模式之接口.docx》由会员分享,可在线阅读,更多相关《JavaScript设计模式之接口.docx(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章接接口接口是面面向对象象的JS程序员员工具箱箱中最有有用的工工具之一一,在四四人组的的设计计模式中关于于可重用用的面向对对象设计计思想的的第一原原则就说说:面向向接口编编程,而而不要面面向实现现编程。这告诉诉你这个个概念有有多么重重要。但问题是是JS没有内内建的方方式去实实现接口口。它也也没有内内建的方方法去确确定一个个对象实实现了和和另一个个对象相相似的方方法集合合。这造造成了对对象不能能交换使使用。但但所幸JS是一门门扩展性性非常强强的语言言,这使使得它可可以很简简单的增加加这些特特性。这一章,我们先先看其他他语言是是如何实实现接口口的,然然后来尝尝试模仿仿它们的的精华。看下利利用J
2、S如何实实现这些些。当然然,我们们最后会会提出一一个可以以检查对对象是否含含有所需需方法的的可重用用的类。什么是接接口接口提供供了那些些方法是是对象必必须的。它不指指定如何何实现这这些方法法,尽管他他也许包包含(或或暗含)了方法法的含义义,例如如,如果果一个接接口包含含了一个个settNamme方法法,你理理所当然然的就会会确定这这个方法法的实现现就是接接受一个个字符串串参数,然后将将其指定定给一个个namme变量。根据对象象提供的的特性来来作为它它们分组组的依据据。例如如,如果果一类看看上去存存在很大大差异的的对象都都实现了Coompaarabble接接口,那那它们就就可以交交替使用用到ob
3、bjecct.ccompparee(annothherOObjeect)上。这允允许两个个不同的的类之间间建立对对话。将将一个接接受类作作为参数数的函数数可改为为接受一一个接口口作为函函数的参参数,这这就允许许将任何何具体实实现的类类传递进进去。一一些没有有联系的的类被允允许同等等的对待待。使用接口口的好处处接口在JJS的面向向对象中中可以做做什么?建立一一个接口口可以起起到自我说明明和提升升重用性性的功效效。接口口告诉程程序员一一个更易易用的类类需要实实现哪些些方法。如果你你熟悉一一个接口口,你就就已经知知道了用用任何一一个存在在的类去去实现它它,提升升已存在在类可重重用的机机会。接口使得得
4、不同类类之间的的沟通更更加稳固固。提前前知道接接口,你你就可以以减少集集成两个个对象时时出现的的错误。接口允允许你提提前指定定一个类类需要有有哪些特特性和操操作。一一个程序序员因为为需要为为某个类类编写了了一个接接口,然然后把它它交给了了另外一一个程序序员。第第二个程程序员一一旦实现现了这个个接口,那无论论用什么么方法,这个类类都会正正常运转转。这在在大型工工程中尤尤为有效效。检测测和调试试变得更更加简单单。在类类似与JS这样的的弱类型型语言中中,跟踪踪类型匹匹配错误误非常困困难。但但使用接接口就会会让这变变得简单单一些,因为如如果一但但某个类类没有所所期望的的类型或或者没有有实现某某个需求求
5、的接口口,显式式的错误误就会给给出。然然后逻辑辑错误被被限制在了它它们自己己的方法法中,而而不是对对象之间间中。接接口也保保证了你你代码的的重用性性更加稳稳定,因因为所有有的类必必须随着着所实现现接口的的改动而而改动。如果你你为某个个接口增增加了一一个操作作,而没没有为实实现这个个接口的的类增加加相应的的操作,那错误误马上就就会出现现。使用接口口的缺点点。使用接口口并不是是没有缺缺点。JS之所以以是一门门非常灵灵活的语语言,在在很大程程度上是是由于它它的弱类类型。使使用接口口就意味味着强类型型,这降降低了JS的灵活活性。JS没有有内建的的接口支支持,模模仿其他他语言内内建的机机制常常常带来一一
6、些风险险。它没没有intterffacee关键字字。所以以你为用用来实现现接口的的方法比比起C+和JAVVA来都显得非非常困难难。在JS中中使用任任何的接接口都会会使性能能有所下下降。因因为部分分的开销销要用来来调用另另外的函函数。我我们的实实现用了了两个for循环来来迭代遍遍历每个个方法到到每个请请求的接接口。对对一些实实现大型型接口或或很多接接口的类类来说,这种迭迭代需要要花费一一些时间间并对系系统性能能造成负负面影响响。如果果你担心心这点,你可以以在开发发完成后后跳过这这一步,或这给给它一个个调试标标志,以以便其在在产品环环境中不不执行。但必须须要保证证过早的的优化。类似于于firreb
7、uug这样可可以帮你你检测接接口是否否被剥离离出来的的调试工工具是非非常必须须的。最大的缺缺点是你你无法使使其他的的程序员员严格遵遵循你所所编写的的接口。在其他他语言中中intterffacee是内建建的,如如果程序序员为某某个类实实现了一一个接口口,编译译器就会会检查这这个类是是否真正正的实现现了这个个接口。在JS中,你你必须人人工的确确定给定定的类是是否实现现了一个个接口。你可以以利用代代码规范范和辅助助类来缓缓解这个个问题,但却无无法完全全解决。如果其其他程序序员和你你共同做做一个项项目而无无视你的的借口,那你也也没办法法强迫他他们。接口在其其他面向向对象语语言中的的应用我们简短短看一下
8、下三种常常用的面面向对象象语言是是如何处处理接口口的,你你会发现现他们之之间非常常类似。我们再再“接口类”这一节节中创建建intterffacee类时,会尽可可能的模模仿这些些机制。JAVAA使用了了一种典典型的方方法来实现现接口,我们先先从它开开始。这是jaava.io包包中的一一个接口口publlic intterffacee DaataOOutpput voidd wrriteeBoooleaan(bboolleann vaaluee) tthroows IOEExceeptiion;voidd wrriteeBytte(iint vallue) thhrowws IIOExxceppt
9、ioon;voidd wrriteeChaar(iint vallue) thhrowws IIOExxcepptioon;voidd wrriteeShoort(intt vaaluee) tthroows IOEExceeptiion;voidd wrriteeIntt(innt vvaluue) thrrowss IOOExccepttionn;.这是一个个类所必必须实现现的方法法列表,与参数数和异常常联系到到一起,每一行行都是看看起来很很相似的的方法声声明,异异常后面面是分号号,而不不是一对对大括号号。创建一个个使用这这个借口口的类,需要impllemeentss关键字字publlic
10、 claass DattaOuutpuutSttreaam eexteendss FiilteerOuutpuutSttreaam iimpllemeentss DaataOOutpput publlic finnal voiid wwritteBoooleean (bboolleann vaaluee) tthroows IOEExceeptiion writte (vallue ? 11 : 0);.每一个接接口中列列出的方方法都被被声明和和实现,如果某某个方法法没有被被实现,错误就就会在编编译的时时候显示示,类似似如下MyCllasss shhoulld bbe ddecllareed
11、aabsttracct; it doees nnot deffinee wrriteeBoooleaan(bboolleann) iin MMyCllasss.PHP使使用了相相同的语语法:inteerfaace MyIInteerfaace publlicffuncctioon iinteerfaaceMMethhod($arrgummenttOnee, $arggumeentTTwo);classs MMyCllasss immpleemennts MyIInteerfaace publlic funnctiion intterffaceeMetthodd($aarguumenntOnne
12、, $arrgummenttTwoo) retuurn $arrgummenttOnee . $arrgueemnttTwoo;classs BBadCClasss iimpllemeentss MyyIntterffacee / NNo mmethhod decclarratiionss./ BBadCClasss ccausses thiis eerroor aat rrun-timme:/ FFataal eerroor: Claass BaddClaass conntaiins 1 aabsttracct mmethhodss annd mmustt thhereeforre bbe
13、/ ddecllareed aabsttracct (MyIInteerfaace:innterrfacceMeethood)还有C#inteerfaace MyIInteerfaace striing intterffaceeMetthodd(sttrinng aarguumenntOnne, strringg arrgummenttTwoo);classs MMyCllasss : MyIInteerfaace publlic strringg innterrfacceMeethood(sstriing arggumeentOOne, sttrinng aarguumenntTwwo) r
14、etuurn arggumeentOOne + aarguumenntTwwo;classs BBadCClasss : MyyIntterffacee / NNo mmethhod decclarratiionss./ BBadCClasss ccausses thiis eerroor aat ccomppilee-tiime:/ BBadCClasss ddoess noot iimpllemeent intterffacee meembeer MMyInnterrfacce.iinteerfaaceMMethhod()所有这些些语言都都大体上上使用了了相同的的方法。一个接接口包含含了那
15、些些方法需需要被实实现,以以及这些些方法需需要的参参数。在在类中,先是声声明了它它要实现现哪个接接口,通通常是使使用impplemmentts关键字字。每个个类都可可以实现现不止一一个接口口。如果果接口中中的哪个个方法没没有被实实现,错错误就会会抛出。根据语语言的不不同,这这会在编编译或者者运行时时发生。错误信信息告诉诉用户三三件事:类名,接口名名,未被被实现的的方法名名。很明显,我们不不能用同同样的途途径实现现借口,因为JS中没有intterffacee和impplemmentts关键字字。因此此不能在在运行时时检查是是否遵循循接口。然而,使用辅辅助类和和显式的的遵从性性检查以以模拟接接口的
16、大大部分特特性确实实可能的的。在JS中中模拟接接口我们将讨讨论在JS中模拟拟接口的的三种方方法:注注释,属属性检查查和鸭子子类型,没有哪哪种方案案是完美美的,但但结合这这三种方方法就会会趋于完完美。用注释描描述接口口最简单也也是效果果最差的的接口模模拟是使使用注释释。模仿仿其他面面向对象象语言的的方式,在注释释中使用用intterffacee和impplemmentts关键字字。这无无法检测测语法错错误,这这有一个个例子显显示了关关键字如如何被添添加到代代码中以以起到说说明的作作用。/*inteerfaace Commpossitee funcctioon aadd(chiild);funcc
17、tioon rremoove(chiild);funcctioon ggetCChilld(iindeex);inteerfaace ForrmIttem funcctioon ssavee();*/var CommpossiteeForrm = fuuncttionn(idd, mmethhod, acctioon) / iimpllemeentss Coompoositte, ForrmIttem.;/ IImpllemeent thee Coompoositte iinteerfaace.CompposiiteFFormm.prrotootyppe.aadd = ffuncctioon(
18、cchilld) .;CompposiiteFFormm.prrotootyppe.rremoove = ffuncctioon(cchilld) .;CompposiiteFFormm.prrotootyppe.ggetCChilld = fuuncttionn(inndexx) .;/ IImpllemeent thee FoormIItemm innterrfacce.CompposiiteFFormm.prrotootyppe.ssavee = funnctiion() .;这并没有有很好的的模拟接接口的功功能,他他没有检检查以确确保commpossiteeForrm确实实实现了正正确
19、地方方法集合合。也没没有抛出出错误以以通知程程序员问问题所在在,除了了说明外外它没有有起到任任何作用用。所有有的一致致性都要要靠程序序员完全全自发完完成。然而,这这种方法法也有一一些优点点,它容容易实现现,不需需要额外外的类或或函数。提升了了可重用用性,因因为类有有了接口口说明并并且可以以跟其他他实现了了相同接接口的类类交换。它不影影响文档档的大小小和执行行速度。当代码码展开式式,这些些注释可可以被轻轻易的剥剥离。避避免了因因使用接接口而造造成文件件大小的的增加。但是,由于无无法给出出错误。他不能能帮助检检查和调调试代码码。用属性检检查模拟拟接口第二种方方法就要要严格一一些了,所有类类显示声声
20、明了所所要实现现的接口口,这些些声明被被想要与与这些类类结合的的对象检检查,接接口依然然仅仅是是个注释释,但是是你现在在可可以以检查一一个属性性,看它它的类“自称”实现了了一个什什么接口口。/*inteerfaace Commpossitee funcctioon aadd(chiild);funcctioon rremoove(chiild);funcctioon ggetCChilld(iindeex);inteerfaace ForrmIttem funcctioon ssavee();*/var CommpossiteeForrm = fuuncttionn(idd, mmethhod
21、, acctioon) thiss.immpleemenntsIInteerfaacess = CCompposiite, ForrmIttem;.;.funcctioon aaddFFormm(foormIInsttancce) if(!impplemmentts(fformmInsstannce, CCompposiite, ForrmIttem) throow nnew Errror(Obbjecct ddoess noot iimpllemeent areequiiredd innterrfacce.);./ TThe impplemmentts ffuncctioon, whiich
22、 cheeckss too seee iif aan oobjeect decclarres thaat iit / iimpllemeentss thhe rrequuireed iinteerfaacess.funcctioon iimpllemeentss(obbjecct) for(varr i = 11; ii arggumeentss.leengtth; i+) / Looopiing thrrouggh aall arggumeentss / aafteer tthe firrst onee.var intterffaceeNamme = arrgummenttsii;var i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JavaScript 设计 模式 接口
限制150内