JavaScri設(shè)計(jì)模式之接口_第1頁(yè)
JavaScri設(shè)計(jì)模式之接口_第2頁(yè)
JavaScri設(shè)計(jì)模式之接口_第3頁(yè)
JavaScri設(shè)計(jì)模式之接口_第4頁(yè)
JavaScri設(shè)計(jì)模式之接口_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第二章接口接口是面向?qū)ο蟮腏S程序員工具箱中最有用的工具之一,在四人組的《設(shè)計(jì)模式》中關(guān)于可重用的面向?qū)ο笤O(shè)計(jì)思想的第一原則就說(shuō):面向接口編程,而不要面向?qū)崿F(xiàn)編程。這告訴你這個(gè)概念有多么重要。但問(wèn)題是JS沒(méi)有內(nèi)建的方式去實(shí)現(xiàn)接口。它也沒(méi)有內(nèi)建的方法去確定一個(gè)對(duì)象實(shí)現(xiàn)了和另一個(gè)對(duì)象相似的方法集合。這造成了對(duì)象不能交換使用。但所幸JS是一門擴(kuò)展性非常強(qiáng)的語(yǔ)言,這使得它可以很簡(jiǎn)單的增加這些特性。這一章,我們先看其他語(yǔ)言是如何實(shí)現(xiàn)接口的,然后來(lái)嘗試模仿它們的精華??聪吕肑S如何實(shí)現(xiàn)這些。當(dāng)然,我們最后會(huì)提出一個(gè)可以檢查對(duì)象是否含有所需方法的可重用的類。什么是接口接口提供了那些方法是對(duì)象必須的。它不指定如何實(shí)現(xiàn)這些方法,盡管他也許包含(或暗含)了方法的含義,例如,如果一個(gè)接口包含了一個(gè)setName方法,你理所當(dāng)然的就會(huì)確定這個(gè)方法的實(shí)現(xiàn)就是接受一個(gè)字符串參數(shù),然后將其指定給一個(gè)name變量。根據(jù)對(duì)象提供的特性來(lái)作為它們分組的依據(jù)。例如,如果一類看上去存在很大差異的對(duì)象都實(shí)現(xiàn)了Comparable接口,那它們就可以交替使用到objectpare(anotherObject)上。這允許兩個(gè)不同的類之間建立對(duì)話。將一個(gè)接受類作為參數(shù)的函數(shù)可改為接受一個(gè)接口作為函數(shù)的參數(shù),這就允許將任何具體實(shí)現(xiàn)的類傳遞進(jìn)去。一些沒(méi)有聯(lián)系的類被允許同等的對(duì)待。使用接口的好處接口在JS的面向?qū)ο笾锌梢宰鍪裁??建立一個(gè)接口可以起到自我說(shuō)明和提升重用性的功效。接口告訴程序員一個(gè)更易用的類需要實(shí)現(xiàn)哪些方法。如果你熟悉一個(gè)接口,你就已經(jīng)知道了用任何一個(gè)存在的類去實(shí)現(xiàn)它,提升已存在類可重用的機(jī)會(huì)。接口使得不同類之間的溝通更加穩(wěn)固。提前知道接口,你就可以減少集成兩個(gè)對(duì)象時(shí)出現(xiàn)的錯(cuò)誤。接口允許你提前指定一個(gè)類需要有哪些特性和操作。一個(gè)程序員因?yàn)樾枰獮槟硞€(gè)類編寫了一個(gè)接口,然后把它交給了另外一個(gè)程序員。第二個(gè)程序員一旦實(shí)現(xiàn)了這個(gè)接口,那無(wú)論用什么方法,這個(gè)類都會(huì)正常運(yùn)轉(zhuǎn)。這在大型工程中尤為有效。檢測(cè)和調(diào)試變得更加簡(jiǎn)單。在類似與JS這樣的弱類型語(yǔ)言中,跟蹤類型匹配錯(cuò)誤非常困難。但使用接口就會(huì)讓這變得簡(jiǎn)單一些,因?yàn)槿绻坏硞€(gè)類沒(méi)有所期望的類型或者沒(méi)有實(shí)現(xiàn)某個(gè)需求的接口,顯式的錯(cuò)誤就會(huì)給出。然后邏輯錯(cuò)誤被限制在了它們自己的方法中,而不是對(duì)象之間中。接口也保證了你代碼的重用性更加穩(wěn)定,因?yàn)樗械念惐仨氹S著所實(shí)現(xiàn)接口的改動(dòng)而改動(dòng)。如果你為某個(gè)接口增加了一個(gè)操作,而沒(méi)有為實(shí)現(xiàn)這個(gè)接口的類增加相應(yīng)的操作,那錯(cuò)誤馬上就會(huì)出現(xiàn)。使用接口的缺點(diǎn)。使用接口并不是沒(méi)有缺點(diǎn)。JS之所以是一門非常靈活的語(yǔ)言,在很大程度上是由于它的弱類型。使用接口就意味著強(qiáng)類型,這降低了JS的靈活性。JS沒(méi)有內(nèi)建的接口支持,模仿其他語(yǔ)言內(nèi)建的機(jī)制常常帶來(lái)一些風(fēng)險(xiǎn)。它沒(méi)有interface關(guān)鍵字。所以你為用來(lái)實(shí)現(xiàn)接口的方法比起C++和JAVA來(lái)都顯得非常困難。在JS中使用任何的接口都會(huì)使性能有所下降。因?yàn)椴糠值拈_(kāi)銷要用來(lái)調(diào)用另外的函數(shù)。我們的實(shí)現(xiàn)用了兩個(gè)for循環(huán)來(lái)迭代遍歷每個(gè)方法到每個(gè)請(qǐng)求的接口。對(duì)一些實(shí)現(xiàn)大型接口或很多接口的類來(lái)說(shuō),這種迭代需要花費(fèi)一些時(shí)間并對(duì)系統(tǒng)性能造成負(fù)面影響。如果你擔(dān)心這點(diǎn),你可以在開(kāi)發(fā)完成后跳過(guò)這一步,或這給它一個(gè)調(diào)試標(biāo)志,以便其在產(chǎn)品環(huán)境中不執(zhí)行。但必須要保證過(guò)早的優(yōu)化。類似于firebug這樣可以幫你檢測(cè)接口是否被剝離出來(lái)的調(diào)試工具是非常必須的。彩最大的缺點(diǎn)陪是你無(wú)法使辜其他的程序擊員嚴(yán)格遵循雖你所編寫的藍(lán)接口。在其信他語(yǔ)言蜓中認(rèn)inter絡(luò)face韻是內(nèi)建的,宰如果豈程序員為某習(xí)個(gè)類實(shí)現(xiàn)了局一個(gè)接口,提編譯器就會(huì)麻檢查這個(gè)類木是否真正的物實(shí)現(xiàn)了這個(gè)籠接罪口。極在礎(chǔ)J萌S測(cè)中,你必須咐人工的確定勾給定的類是碌否實(shí)顛現(xiàn)了一個(gè)接黨口。你可以傅利用代碼規(guī)猜范和輔助類監(jiān)來(lái)緩解這個(gè)盜問(wèn)題培,但卻無(wú)法杏完全解決。摘如果其他程諷序員和你共過(guò)同做一個(gè)項(xiàng)鉛目而無(wú)視你鈔的借口,那駐你也沒(méi)辦法剃強(qiáng)迫他們。窗接口在其他妄面向?qū)ο笳Z(yǔ)猛言中的應(yīng)用我我們簡(jiǎn)短看渡一下三種常精用的面向?qū)μ蚁笳Z(yǔ)言是如被何處理接口膏的,你會(huì)發(fā)吐現(xiàn)他們之間咸非常類似。頭我們步再裁“姨接口診類柿”秧這一節(jié)中創(chuàng)燥建久inter持fac橋e勻類時(shí),會(huì)盡術(shù)可能的模仿翻這些機(jī)制。胖JAV遭A撇使用了一種皆典型的錯(cuò)方那法垂來(lái)實(shí)現(xiàn)接口朵,我們先從宮它開(kāi)始。窄這是切java.逆io洗包中的一個(gè)嶼接口辛publi陶cint至erfac晉eDat袋aOutp敏ut{蟲(chóng)void巴write清Boole席an(bo峰olean佩valu傾e)th豬rows呀IOExc緒eptio蘭n;施void再write呆Byte(折intv罩alue)爛thro率wsIO上Excep足tion;姓void蛙write丙Char(甜intv還alue)淺thro裂wsIO憲Excep晨tion;恐void疼write籮Short植(int肉value姨)thr住owsI拾OExce另ption走;厭void評(píng)write帝Int(i沃n下tval薦ue)t色hrows島IOEx樓cepti須on;...}鎖這是一個(gè)類阿所必須實(shí)現(xiàn)殿的方法列表怎,與參數(shù)和遍異常顛聯(lián)系到一起給,每一行都耽是看起來(lái)很豈相似的方法久聲明,異常板后面是分號(hào)皇,而不是一愧對(duì)大括號(hào)。惜創(chuàng)建一個(gè)使樣用這個(gè)借口茫的類,需藏要堂i嘴mplem逆ents形關(guān)鍵字惕publi移ccla礎(chǔ)ssDa課taOut葛putSt論ream醉exten券dsFi喪lterO制utput駕Strea害mimp途lemen誰(shuí)tsDa恭taOut題put{累publi甘cfin際alvo張idwr貴ite燒Boole撲a尺n媽(boo弱lean因value兄)稍thro原wsIO贊Excep出tion駝{膚write諒(val蠟ue?愁1:貪0);}...}倚每一個(gè)接軌口中列出的前方法都被聲甜明和實(shí)現(xiàn),惱如果某個(gè)方城法沒(méi)有被實(shí)留現(xiàn),錯(cuò)誤就迅會(huì)在編譯的帆時(shí)候顯示,秒類似如下鞏MyCla煙sssh鳥(niǎo)ould榆bede悠clare巖dabs哨tract承;it爆does組notd輸efine演writ顫eBool界ean(b暖oolea含n)in扭MyCl筒ass.月PH申P(guān)敞使用了相同距的語(yǔ)間法甘:羞inter慶face劑MyInt蠻erfac候e{稼publi陷c選之funct擠ioni移nterf原a艱ceMet瓦h(yuǎn)od($財(cái)argum游entOn巷e,$a愿rgume通ntTwo稻)氧;}柳class辱MyCl腰assi事mpl插e(cuò)ment貴sMyI確nterf腹ace{懼publi水cfun釋ction報(bào)inte續(xù)rface黨Metho澇d($ar針gumen墳tOne,塵$arg井ument嘉Two)搞{澆retur投n$ar巧gumen特tOne辭.$ar摘guemn推tTwo;}}氣class獵BadC失lass泊imple遲ments菠MyIn愧terfa味ce{刊//No折meth和odde售cla阿r沿ation弊s.}剝//Ba暫d培Class對(duì)caus譜esth沖iser篩rora尼t(yī)run筒-time覺(jué):積//Fa美tale在rror:鹿Clas偏s扮BadC女lass汁conta丑ins1剝abst飯ract件metho顧dsan跳dmus形tthe技refor癥ebe財(cái)//de侮clare古dabs例tract倡(MyI洞nterf祥ace::立inter蜻faceM腎ethod繼)還有C#譽(yù)inter網(wǎng)face殲MyInt礎(chǔ)erfac僅e{拆strin今gint皮erfac紋eMeth風(fēng)od(st歷ring困argum招entOn伙e,st帝ring遣argu煮mentT貍wo);}封class抬MyCl浩ass:域MyIn依terfa斥ce{青publi碑cstr酬ingi皆n爹terfa開(kāi)ceMet窄h(huán)od(s美tring俊argu配mentO理ne,s薯tring栽argu零mentT直wo){漢retur虎narg甚ument土One+禿argu艘mentT代wo;}}風(fēng)class損BadC視lass昆:MyI鳳nterf廉a(chǎn)ce{喂//No你meth忽odde捆clara執(zhí)tions膨.}口//Ba根dClas帽scau宴sest瘦hise階rror喘atco玉mpile岡-tim御e:伯//Ba笑dClas哀sdoe鏡snot芳impl嘆ement錫inte遞rface孟memb怖erMy才Inter山face.產(chǎn)inter聽(tīng)faceM屬ethod屈()亂所有這些語(yǔ)進(jìn)言都大體上酷使用了相同漫的方法。一污個(gè)接口包含說(shuō)了那些方法辦需要被實(shí)現(xiàn)原,以及這些移方法需要的爸參數(shù)。在類清中,先是聲吃明了它要實(shí)崖現(xiàn)哪個(gè)接口贈(zèng),通常是使仍用飽imple兆ment狠s脆關(guān)鍵字。每鼠個(gè)類都可庭以實(shí)現(xiàn)不止屋一個(gè)接口雁。如果接口古中的哪個(gè)方引法沒(méi)有被實(shí)仿現(xiàn),錯(cuò)誤就廳會(huì)拋出。根冷據(jù)語(yǔ)言的不從同,這會(huì)在示編譯或者運(yùn)馳行時(shí)發(fā)生束。錯(cuò)誤信息薦告訴用戶三惱件事:類名說(shuō),接口名,蕩未被實(shí)現(xiàn)的弓方法名。雖很投明顯,我們南不能用同樣叔的途徑實(shí)現(xiàn)魯借口,因科為張J普S損中沒(méi)泳有息inter仔fac汁e躲和丘imple崖ment津s他關(guān)鍵字。因荷此不能在運(yùn)垂行時(shí)檢吩查是否遵循邀接口。然而象,使用輔助匠類和顯式的汗遵從性檢查疼以模擬接口宇的大部分特柔性確實(shí)可能公的。荷在肉J寺S膨中模擬接口冰我們將討論快在份J棒S咸中模擬接口籍的三種方法責(zé):注釋,屬兵性檢查和鴨戴子類型,沒(méi)盟有哪種方案挎是完美的,抬但結(jié)合這三削種方法就會(huì)評(píng)趨于完美。寬用薄注錦釋描述接口換最簡(jiǎn)單也是用效果最差的購(gòu)接口模擬是議使用注釋。蘇模仿其他面挪向?qū)ο笳Z(yǔ)言緒的方式,在來(lái)注釋中使助用怨inter姐fac足e刪和順imple勝ment掩s溉關(guān)鍵字。這箏無(wú)法檢測(cè)語(yǔ)梅法錯(cuò)誤,這禿有一均個(gè)例子顯示掉了關(guān)鍵字如跑何被添加到補(bǔ)代碼中以起疏到說(shuō)明的作田用。/*旨inter派face范Compo帝site乖{迎func意tion艇add(c員hild)捐;右funct別ionr秧emove植(chil鵲d);銳funct壺iong吊etChi丑ld(in液dex);}康inter派face忙FormI泉tem{壇funct部ions端ave()董;}*/館va鹽rCom融posit往eForm桑=fu何nctio訓(xùn)n(id,請(qǐng)meth辛od,a羅ction鹿){/魂/imp寫lemen睜tsCo疑mposi族te,F填ormIt技em...};泛//Im雁pleme篇ntth危eCom匙posit掘eint辮erfac膠e.幣Compo氧siteF手orm.敲proto來(lái)type.彈add=黨func繁tion(決child平){...};臨Compo峽siteF董orm.p受rotot述ype.r券emove逃=fu舊nctio貌n(chi恢ld){...};堵Compo胖siteF養(yǎng)orm.p流rotot陳ype.g兇etChi偽ld=絕funct鵝ion(i猴ndex)退{(lán)...};姜//Im款pleme滲ntth誼eFor互mItem房inte貞rface聯(lián).根Co掃mposi海teFor旁經(jīng)totyp析e.sav功e=f坑uncti莊on()弦{...};倘這并沒(méi)有很礎(chǔ)好的模毫擬接口的功冒能,他沒(méi)有窄檢查以確廚保綢compo羅siteF饑or餃m言確實(shí)實(shí)現(xiàn)了歉正確地方法唯集合。也沒(méi)貫有拋出錯(cuò)誤孤以通知程序使員問(wèn)題所在吩,除了說(shuō)明著外它沒(méi)有起押到任何作用虹。所有的一夜致性都要靠拐程序員完全到自發(fā)完成。浙然而,這種蹦方法也有一蒜些優(yōu)點(diǎn),它屑容易實(shí)現(xiàn),嘴不需要額外遵的類或函數(shù)距。提升了可滾重用性,因卸為傲類有了接口苦說(shuō)明并且可擁以跟其他實(shí)譯現(xiàn)了相同接椅口的類交換球。它不影響臘文檔的大小君和執(zhí)行速度燦。當(dāng)代碼展宇開(kāi)式,這些多注釋可以被扔輕易的剝離次。避免變了因使用接音口而造成文朽件大小的增啞加。但是,蛋由于無(wú)法給撥出錯(cuò)誤。他牢不能幫助檢允查和調(diào)試代帳碼。雀用屬性檢查婚模搬擬接口捉第二種方掛法就要嚴(yán)格沉一些了,所含有類顯示聲貫明了所要實(shí)萄現(xiàn)的接口,繳這些聲明被艘想要與這些耐類結(jié)合的對(duì)帥象檢查,接摘口依然僅僅或是個(gè)注釋,戒但是你現(xiàn)在屠可可以檢查表一個(gè)屬性,慕看它的詞類濾“種自波稱太”誠(chéng)實(shí)現(xiàn)了一個(gè)尖什么接口。/*棟inter信face雅Compo倦site忽{扯funct炮iona單dd(ch扇ild);晶funct錦ionr塵emove鐘(chil宜d);宜funct藝iong刻etChi憂ld(in谷dex);}牧inter菠face麻FormI儉tem{痰funct麥ions數(shù)ave()憶;}*/盲varC匙o(hù)mpos雅iteFo脊rm強(qiáng)=fu懸nct性ion(i矩d,me詳thod,靠acti億on){笛this.兆imple株ments熔Inter孤faces賺=['顫Compo花site'暮,'Fo員rmIte遍m'];...};...爽funct富iona漏ddFor愚m(for縣mInst岡ance)單{水if(!i型mplem龍ents(僚formI暑nstan起ce,'飽Compo裁site'員,'Fo圓rmIte盜m'))針{悉throw徐new靠Error膠(挑"Obje戚ctdo劍esno格timp全lemen關(guān)tare于quire索dint虹erfac優(yōu)e.");}...}媽//Th涌eimp帝lemen虹tsfu套nctio晴n,wh潮ichc渾hecks演tos與eeif越ano宣bject郵decl膚ares怠that證it中//im傅pleme勵(lì)ntst個(gè)here誘quire儉dint齒erfac嚼es.鵝funct三ioni茅mplem具ents(野objec孔t){逐for(v麥ari俱=1;嫩i<a抗rgume牙nts.l劇ength活;i++堵){/注/Lo亡oping冬thro乏ugha途llar益gumen寧ts療//af揮tert順hefi編rsto玉n萌e.忙vari叔nterf清aceNa戶me=籠argum北ents[要i];樓vari象nterf演aceFo屑und=治fals游e;陣for(v訴arj雄=0;哀j<o闊bject焦.impl攏ement賞sInte畜rface屆s.len練gth;毅j++)吊{直if(ob既ject.污imple蠻ments岸Inter待faces賤[j]=宋=int己erfac鴉eName童){聾inter秒faceF巴ound狂=tru仍e;呼br何eak;}}拿if(!i辦nterf屠aceFo扯und)閑{緒retur籮nfal給se;/留/An磚inte臣rfa眼cewa馳snot涼foun伸d.}}見(jiàn)retur釣ntru貫e;//污All扣inter御faces假were閣foun襖d.}詢?cè)谶@個(gè)例子沫中玉,碼Compo妙siteF薪or滑m伶聲明了它要份實(shí)現(xiàn)兩個(gè)接戒口冬,偷Compo緞sit緞e負(fù)和死FormI罪te援m洲,這是通過(guò)臉把接口們的間名稱添加到淚一個(gè)數(shù)組中贏實(shí)現(xiàn)的,數(shù)姨組標(biāo)記凱為杜imple蛙mentI應(yīng)nterf浙ace彈s窗。這個(gè)類顯提示聲明了它政將支持那個(gè)田類。任何一食個(gè)使用確定偉的類型作為載參式數(shù)的函數(shù)都饞可以檢查其康屬性,如果使所要求的接徑口沒(méi)有被實(shí)犯現(xiàn),就會(huì)拋襯出一個(gè)錯(cuò)誤箭。陰這種方法的拳優(yōu)點(diǎn)在于,匆你說(shuō)明了一菜個(gè)類實(shí)現(xiàn)了參哪油些接口,如陷果一個(gè)沒(méi)有頁(yè)聲明它需要準(zhǔn)實(shí)現(xiàn)的某個(gè)疊接口,就會(huì)嘗出現(xiàn)錯(cuò)誤??憧梢岳缅a這些錯(cuò)誤強(qiáng)敢迫其它程序頭員聲明這些繡接口。菊然而它的缺今點(diǎn)在于你無(wú)犁法確定類是拒否真正實(shí)現(xiàn)希了這個(gè)接口祥,你僅知道傅它腿“葵自息稱賄”辮實(shí)現(xiàn)了接口株。創(chuàng)建一個(gè)牲聲明了卻忘王了實(shí)現(xiàn)接口僚的類是非常善容易的,所擠有的檢測(cè)都昏會(huì)通過(guò),但較沒(méi)有實(shí)現(xiàn)方留法,這就造諒成了銜潛在的問(wèn)題更。當(dāng)然,顯悔示的聲明類避所要支持的駛接口無(wú)疑也連增加了工作為兩。嘗用鴨子類型落模擬接口妻事實(shí)上,一畜個(gè)類是否聲夢(mèng)明了它堅(jiān)所支持的接伙口是無(wú)關(guān)緊芽要的,只需價(jià)要函數(shù)出現(xiàn)蓬在正確的地酷方。這就是預(yù)使用鴨子類訂型的合適地兵方。鴨子類報(bào)型的意思是圾:塌“膨如果它走路預(yù)像音鴨子,叫起擠來(lái)也像鴨子符,那它就是搭鴨承子伙”衫。夫這個(gè)技巧判牲斷對(duì)象是否睜為一個(gè)類的隔實(shí)例完全基歌于它實(shí)現(xiàn)了消什么方法。進(jìn)這種方法的銳含義非常簡(jiǎn)威單,如果一電個(gè)對(duì)象中包臨含的方法和困這個(gè)對(duì)象所嘆要實(shí)現(xiàn)的接爸口中包含的挺方法具有相繩同的名稱,居那么它就實(shí)逢現(xiàn)了這個(gè)方汁法。利用輔嗚助函數(shù),你摟可以確定它宇是否包含相自應(yīng)的函數(shù)。淺//In鍋terfa格ces.記varC啄ompos蜻ite=現(xiàn)new啄Inter碗face(捧'Comp生osite味',['行ad陪d','提remov辣e','欺getCh京ild']劍);披varF界ormIt掏em=尺newI鹿nterf洞ace('寄FormI紅tem',蒜['sa歐ve'])店;產(chǎn)//Co舊mposi姿teFor鴿mcla森ss栗varC輛ompos儀iteFo除rm=國(guó)func弊tion(羽id,m冶ethod己,act片ion)墻{...};...桃funct派iona時(shí)ddFor截m(for藥mInst翻ance)否{壟ensur完eImpl員ement悠s(for寬mInst蹄ance,海Comp喚osite夠,For于mItem串);慧//Th烏isfu奶nctio妙nwil臂lthr昨owan纏erro孟rif嫌arequ迎ired踐metho控dis蚊not撈impl貍ement貧ed....}舞這種方法區(qū)鑄別與前兩種刷方法在于它帽沒(méi)有注釋。賴所有的特性催都是具有強(qiáng)怎制力李。姜ensur識(shí)eImpl選emen達(dá)t伯函數(shù)需要至悉少兩個(gè)參數(shù)叉,第一個(gè)參海數(shù)是需要檢仰測(cè)的對(duì)象,友剩下的參數(shù)哨是這個(gè)對(duì)象怎需要比較的刷接口。這個(gè)及函數(shù)檢測(cè)了揉第一個(gè)參數(shù)絹傳遞進(jìn)來(lái)的訊對(duì)象是否實(shí)板現(xiàn)了接口中脊生命的方法悄。如果沒(méi)有忍,則包含相脊關(guān)信息的錯(cuò)豐誤就會(huì)被拋節(jié)出。信息中距包含了類名巡,接口名,打以及沒(méi)有被劇正確實(shí)現(xiàn)的峽方法名。這息個(gè)函數(shù)可仇以被放置在肥任何需要的忍地方。在這茫個(gè)例子中,占你僅需在它免實(shí)現(xiàn)所需方邁法的情況下吵利叫用蠶addFo勞r未m貸添加表單。討這是倍三種方法中兄最抱有效的,嘆但它仍然有燕一些缺點(diǎn),針一個(gè)類從不勁聲明它實(shí)現(xiàn)眨了哪謝方法惕。這就降低全了代碼的可右重用性。它奶也沒(méi)有像其悉他方法一樣恭有說(shuō)明。它起還需要一個(gè)趟輔助刺類消in港terfa要c么e廚和一個(gè)輔助牌函友數(shù)巧ensur保eImpl厚emen邪t懼。它沒(méi)有檢疑查方法的參捉數(shù)數(shù)量和名婚稱。也沒(méi)有蒙類型檢查,賺緊緊是檢測(cè)懶對(duì)象是否有泄正確地方法鳥(niǎo)名。糧本書(shū)中的接際口實(shí)現(xiàn)乓在本書(shū)中,嫁我們綜合了后第一種方法減和第三種方啦法,用注釋糖來(lái)聲明一個(gè)煉類需要支持運(yùn)哪些接口,湖這提升了類畝的可衣重用性并有淺了說(shuō)明文檔接。我們情用奸Inter炊fac溉e丟輔助類桐和肉Inter套face.賣ensur攝eImpl饑emen娘t級(jí)輔助函數(shù)來(lái)柱執(zhí)遺行顯示檢查區(qū)。當(dāng)對(duì)象沒(méi)籍有通過(guò)檢查獄,就會(huì)返回量一個(gè)相關(guān)的按錯(cuò)誤信息。浮這管是陡Inter捆fac經(jīng)e誤類和注釋相約結(jié)合的例子漂:煙//In種terfa雹ces.后varC楊ompos筆ite=仇new違Inter怒face(縫'Comp扮osite員',['傘add',待'rem傍ove',容'get熟Child倦']);見(jiàn)varF撤ormIt潤(rùn)em=燈newI趣nterf精ace('騾FormI儉tem',螞['sa肚ve'])街;叢//刪Comp搏osite伴Form售class沾varC好ompos遮iteFo仿rm=夠funct恩ion(i蠢d,me鞋th哈od,a洋ction趴){/崇/imp墾lemen碌tsCo燙mposi灑te,F摘ormIt集em...};...難funct笨iona晝ddFor季m(for爭(zhēng)mInst浸ance)減{挨Inter只face.臣ensur飾eImpl歪ement衰s(for購(gòu)mInst蹈ance,帶Comp鴉osite鑒,For口mItem辜);倚//Th吉isfu蒜nctio疤nwil漢lthr棚owan魄erro檔rif播are螺quire威dmet艘hodi才snot繞impl腸ement即ed,窩//ha宮lting四exec澡ution堡of羅thef按uncti磁on.河//Al雜lcod樂(lè)eben威eath訓(xùn)this息line緩will切beex析ecute此donl販y(cè)if桐thec貸hecks叼pass億....}蹲Inter您face.獵ensur壞eImpl慮ement坐s提提供了更嚴(yán)趣格的檢查,穿如果有問(wèn)題也出現(xiàn),就會(huì)園有異常拋出權(quán),異??梢郧帽粨渥讲⑻幪恚蛘咄A碇箞?zhí)行代碼目。總之,程收序員會(huì)立即貓知道問(wèn)題出夠現(xiàn)并加以處付理。接口類煌下面就是我禿們寄在本書(shū)中使破用赴的框Inter炎fac膝e置類帝//Co家nstru悼ctor.兼varI謎nterf研ace=腥f(wàn)unc吼tio丘n(nam條e,me仆thod梁s){忽if(ar眠gumen頃ts.le枕ngth垂!=2)舌{討throw林new卸Error屠("Int因erfac垃econ地struc總torc亦alled迫with減"+塑argum支ents.真lengt徹h+齊"argu重ments福,but喇expe倆cted格exact舍ly2.少");}膛this.谷name拆=nam歐e;擊this.慮metho悉ds=頃[];饒for(v振ari早=0,膜len=塌meth睛ods.l通ength鈔;i<好len;謝i++)求{吉if(t宣ypeof詳meth蹄ods[而i]!=匯='st替ring'吸){總throw黑new曾Error治("Int面erfac哲econ掩struc炒tore援xpect鐘smet賠hodn攝ames謊tobe穗"駛+"pa緞ssed沒(méi)inas聚astr蔽ing."但);}學(xué)this.壟metho狐ds.pu花sh(me虜thods燙[i]);逆仿}興};呈造//St唉atic銹clas扁smet啟hod.毫Inter砍face.療ensur安eImpl角ement笛s=f犁uncti仁on(ob乳ject)紙{坑if(ar安gumen須ts.l倍ength崖<2)率{傘throw腫new項(xiàng)Error贏("Fun陜ction句Inte恐rface俗.ensu冊(cè)reImp樹(shù)lemen囑tsca訊lled捆with接"+串a(chǎn)rgum餐ents.伐lengt有h+逝"argu盟ments剃,but鞋expe釀cted婦atle專ast2零.");}戚for(v醒a(bǔ)ri鉛=1,遵len=烏argu撇ments領(lǐng).leng掩th;卸i<l俯en;i設(shè)++){倚vari砌nterf籌ace=址argu回ments料[i];常if(in獅terfa移ce酬.cons證truct痰or!寇==In灶terfa快ce){股throw帥new雪Error定("Fun失ction罩Inte群rface壇.ensu霞reImp槽lemen挎tsex出pects斬argu宴ments勇"蝴+"tw泳oand料abov庸eto超bein姨stanc幸esof塑Inte絕rface誕.");}賓for(v情arj洞=0,順metho倡dsLen忽=in賢terfa無(wú)ce.me創(chuàng)thod斯s.len屠gth;濫j<m國(guó)ethod坑sLen;跨j++)謝{壽varm唇ethod媽=in貨terfa與ce.me綱thods賽[j];軋if(!慮objec丟t[met演hod]尸||ty臘peof精objec蹤t[met服hod]懂!=='減funct啞ion')敗{耽throw嶺new擊Error喝("Fun耀ction彩Inte絹rface圍.ensu環(huán)reImp鞏lemen與ts:o搖bject替"勤+"do冤esno財(cái)timp屠lemen日tthe涼"+孟inter闊face.廉name陶+"i熄nterf碼ace.掩M的ethod洪"+失metho址d+"腫was確notf殺ound.矮");}}}};附什么時(shí)候使兄用接口煤類違嚴(yán)格的類型缸檢查并非總湯是必畫須,許喝多餐J頸S寺程序員經(jīng)年渠也不曾使用躁一個(gè)接口或障著類型檢查姐。但是當(dāng)你盤使用接口去動(dòng)完成一個(gè)復(fù)俯雜的系統(tǒng)時(shí)迅,這會(huì)變得配非常重要。牙接口看上去貌似乎降低柜了愧J餐S縫的靈活性,淚但實(shí)際上靈奔活性反而得凈到了提高,福因?yàn)轭愔g側(cè)的耦合變得廢更加松散。禮函數(shù)也變得玉更加靈活,稍因?yàn)樵谀銥閳A函數(shù)傳遞進(jìn)祥任何類型的陷參數(shù)后,依物然能使正確嘩地對(duì)象使用聚正確的方法踩,下面幾中雙情形中接口鍵非常有用涂在多名程序狼員合作的大巾型工程中,唐接口是必需溉的葛,通常程序礦員所需要傾的勸AP鉛I錯(cuò)還沒(méi)有寫完虎,或者需要年提供占位程析序以保證工斑程的正常進(jìn)視度。接口投在這種情況下下變得非常黨有價(jià)值。它豪們笑說(shuō)明了可用畝于兩個(gè)程序凱員之間溝正通群的莊AP撕I姨,當(dāng)占位程惜序被正式沃的抱AP穩(wěn)I而所替代時(shí)。祝你立即就會(huì)鴉知道你所需遼要的方法是燥否會(huì)被實(shí)現(xiàn)役。如套果趣AP葛I工在中期開(kāi)發(fā)有中改變,另澡外一個(gè)程序剛員也可以實(shí)熱現(xiàn)相同的接闖口來(lái)無(wú)縫的鬼替代。船包含來(lái)自互斥聯(lián)網(wǎng)的那些單沒(méi)有控制權(quán)艦的代碼越來(lái)麻越普遍,外孔部主機(jī)庫(kù)是近其中的一個(gè)刺例子,如搜全索,電郵和技地圖這樣的再服卻務(wù)第AP父I椅,盡管它們變的來(lái)源可靠西,也要注意斬確保它們的捎改變不要導(dǎo)今致代碼錯(cuò)誤逗。解決途徑頃之一是為你疏以來(lái)的這股些塘A倚P兄I屑創(chuàng)萬(wàn)建怠Inter浪fac剪e溜對(duì)象,然后己檢測(cè)每個(gè)對(duì)跳象是否正確割的實(shí)現(xiàn)了它找們的接口。悶varD珍ynami顧cMap困=n線ewIn順terfa克ce('巡Dynam鞭icMap噴',['描cente吊rOnPo蔥int',必'zoo驗(yàn)m','押draw'贏]);挑funct造iond能ispla尿yRout道e(map戶Insta懲nce)聞{臉I(yè)nter晃face.艙ensur密eImpl霞ement杜s(map簽Insta五ce,D淚ynami讀cMap)魚(yú);彩mapIn吹stanc蘭e.cen足terOn腎Point連(12,新34);乎mapIn旋stanc移e溜.zoom叉(5);閃mapIn革stanc息e.dra屑w();...}田在這個(gè)例子勺中腐,泄displ葉ayRou鏈t掙e膏函數(shù)薯需要傳遞進(jìn)漲來(lái)的參數(shù)對(duì)父象擁有三俱個(gè)指定的方罵法,使普用斑Inter艘fac挽e蠻對(duì)象并調(diào)田用境Inter毫face.敏ensur炊eImpl權(quán)emen春t炊方法就可以盜確定這三個(gè)捎方法是否被海實(shí)現(xiàn),如果餡沒(méi)有則出現(xiàn)唯錯(cuò)誤。錯(cuò)誤浸可以被一個(gè)逝try/c獲atch暴語(yǔ)句撲捉到捐,然后在后眾臺(tái)利斤用竊AJA碗X煩請(qǐng)求提醒你鎖這個(gè)外混部園AP贈(zèng)I寫的錯(cuò)誤。這喜可以使你的條Mash-咬ups脅(讀指通過(guò)多源扒頭信息整合羞,輕松創(chuàng)建著一項(xiàng)新服務(wù)痰)變得更加水健壯和隱秘檔。皮如何使用接紐口類剩最重要馳的一步(也背是最難執(zhí)行敏的一步)是棚確定在你的商代碼中是否布值得使用接太口。難度簡(jiǎn)褲單的項(xiàng)目也強(qiáng)許從接口那屑里得不到什知么好處。你恢得自己境權(quán)衡利弊。竟假如用了,竭下面提供昂如何使用接糠口的方法:皮在宋HTM填L蒼文件中包競(jìng)含點(diǎn)Inter乎fac跌e詢類槳。飼Inter陽(yáng)face.友j擁s敲文件可以在揚(yáng)網(wǎng)站假:續(xù)//jsd火esign乘patte踩rns.c務(wù)om/地獲取。演遍歷并找到凱找到你的代鄉(xiāng)碼中用對(duì)象患做參數(shù)的函墓數(shù)。找出這凳些對(duì)象需要答那些方法才好能使你的代增碼正常工作墨為每個(gè)方法好集合謹(jǐn)慎的臉創(chuàng)建接口鐵移除所有顯廚示的結(jié)構(gòu)體尸檢查。因?yàn)樨?fù)我們用了鴨陳子類型,對(duì)征象的類型已伍經(jīng)無(wú)關(guān)緊要批。裝用困In菌terfa漏ce.en浮sureI京mplem革en煩t競(jìng)替換結(jié)構(gòu)體爪檢查。離你從這里面壽得到了什么預(yù)?你的代碼諷變得更加松省耦合因?yàn)槟惆撞豢吭僖蕾嚾魏谓仡惖膶?shí)例。宜相反的你樓所需要的特儲(chǔ)性在合適的步地方,任何沸具體的實(shí)現(xiàn)川都會(huì)被使用瞧。給你更多滑的自由去優(yōu)囑化和重構(gòu)你磨的代碼。向?qū)嵗菏褂梅涌陬愐嘞胂笠幌履阗M(fèi)創(chuàng)建了一個(gè)叫類,用來(lái)自桶動(dòng)檢測(cè)結(jié)果委并格式化輸則出為一個(gè)網(wǎng)國(guó)頁(yè)視圖。這示個(gè)類的構(gòu)造潮函數(shù)用了一帆個(gè)芬TestR擴(kuò)esult助類的實(shí)例作悼為參數(shù)。然奶后他將數(shù)據(jù)對(duì)壓縮后傳取入搜TestR纖esul退t販對(duì)象并將其險(xiǎn)傳遞給請(qǐng)求妖。這便是古Resul授tForm打atter批最初的樣子點(diǎn)。岔//Re跳s幕ultFo晨rmatt榜ercl歲ass,解befor堪ewe易imple由ment鏡inter即face挪check償ing私.矩varR辨esult除Fo橫rmatt假er=糖funct謠ion(r真esult粉sObje寬ct){側(cè)if(!(敢resul藏tsObj繁ecti檢nstan勸ceOf加TestR市esult惜)){宇throw記new挖Error紋("Res器ultsF些ormat藏ter:逮const瓦ructo具rreq是uires屠ani曾nstan必ce"雞+"of查Test捎Resul吳tas孕anar彩gumen香t."嘆);}睜this.園resul壁tsObj芹ect=鵝resu臨ltsOb行ject;};把Resul程tForm芹atte各塞totyp持e.re超nderR峽esult聰s=f膏uncti仿on()陽(yáng){燕vard振ateOf支Test摔=thi疲s.res斤ultsO誰(shuí)bject恥.getD曬ate()族;獨(dú)varr烏esult亞sArra案y=t沃his.r扇esult喂sObje遭ct.ge米tResu添lts()愚;躲varr孩esult辱sCont煩ainer錄=do般cumen儉t.cre所ateEl稅ement丟('div序');搶var世resul栗tsHea塔der=幅docu栗ment.患creat停eElem妻ent('織h3');趨resul挑tsHea柄de移r.inn頸erHTM包L=狠'Test借Resu斯ltsf糊rom'撈+da琴teOfT字est.t完oUTCS芹tring匠();駁resul霜tsCon話taine辯r.app往endCh牲ild(r義esult扁sHead泛er);曲varr窮esult壁sList惱=do煤cumen賤t.cre卡ateEl白ement陣('ul'慨);長(zhǎng)resul蹄tsCon暗taine標(biāo)r.app尺endCh章ild(r安esult親sList鼻);喬for(v竄ari耽=0,逝len=坑resu餅ltsAr釋ray.l近ength皂;i<皺len;陷i++)確{絡(luò)varl筆istIt西em戚=doc跨ument佳.crea算teEle錫ment(妨'li')智;蹤listI鵝tem.i冊(cè)nnerH噸TML=度resu縱ltsAr錄ray[i葛];馳resul脊tsLis陽(yáng)t.app爬endCh上ild(l很istIt內(nèi)em);}預(yù)retur薪nres我ultsC痛ontai腐ner;};楚這個(gè)類在構(gòu)妻造函數(shù)中執(zhí)身行了一個(gè)檢娃查以保證參理數(shù)確實(shí)旦為辨TestR瓣esul斷t薪的實(shí)例;如暴果不是,拋偽出異常。擇這可以讓你柄代碼中的肝rende灌rResu廈lts牙方法知道放getDa抽te慰方法和偵getRe慮sults慢方法是可用傷的。是這樣拴嗎,倉(cāng)在構(gòu)造函數(shù)封中,你僅僅您檢查了縣r議esult艱sObje歲ct柜突是倒TestR治esul襯t挽的實(shí)例。這滲并不能保證暴你所需要的壇方法被實(shí)現(xiàn)塑了?;═estR孤esult褲可以被修改沖并不再擁有獲一個(gè)據(jù)getDa稀te縱方法。這個(gè)抄檢查會(huì)通過(guò)絲,但驟rende蕩rResu炎lts膛就會(huì)失效。扮結(jié)構(gòu)體中的事檢查還有不皆必要的限制咬。它禁止了斃其它類的實(shí)鍛例作為參數(shù)井,即使它們縫能很好的運(yùn)停行。例如你穩(wěn)有一個(gè)唯Weath螞erDat摸a貿(mào)類。它有吹getDa能te鈴和款getRe慰su樹(shù)lts悉方法并可以盾在夾Resul畏tForm蹈atter巾中運(yùn)行而沒(méi)叨有任何問(wèn)題輪。但是用顯憐示的類型檢腦查(用扁insta軟nceOf漿操呈作符)就會(huì)閥禁止膠Weath鈔er捷Data癢的任何實(shí)例濁。解決辦法串是移除儀insta撲nceOf寫檢查并用接勒口代替。第窗一步是創(chuàng)建母接口

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論