資源描述:
《設(shè)計(jì)模式-適配器》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、設(shè)計(jì)模式之---適配器適配器模式先考慮這種設(shè)計(jì)模式適用場景:假如我們有一個(gè)運(yùn)行良好的接口以及其實(shí)現(xiàn),(Version1.0,比如說是按照用戶要求開發(fā)的日志系統(tǒng),這個(gè)日志系統(tǒng)是基于文件記錄的FileLogger),但是由于系統(tǒng)升級(jí)或者用戶需求變化等,我們又設(shè)計(jì)了一個(gè)新的接口以及實(shí)現(xiàn)(Version2.0,比如說是按照用戶的要求,讓日志系統(tǒng)是基于數(shù)據(jù)庫記錄的DBLogger),并且這個(gè)新設(shè)計(jì)的接口也能良好運(yùn)行...假如到此為止,我們還沒看出設(shè)計(jì)模式的用武之地。然而,我們知道,用戶的需求創(chuàng)意是無窮無盡的,現(xiàn)在用戶說了,我們想同時(shí)用這兩種日志系統(tǒng)...就是說,現(xiàn)如今的
2、業(yè)務(wù)是運(yùn)行在Version2.0的接口上,但是我要用Version1.0的實(shí)現(xiàn)...好,需求出來了,那么怎么實(shí)現(xiàn)呢?兩個(gè)接口的方法都不一致(兼容)?說起來也簡單,大約有這么2套方案:1,我們按照DBLogger的接口,在重新開發(fā)一套,適用于文件系統(tǒng)的日志。2,直接修改Version1.0的代碼。先說第一種方案,這么做確實(shí)可以,而且很直觀。但是在我們已完成相應(yīng)功能的前提下,再重新寫一套代碼其實(shí)是沒有必要的,并且代碼復(fù)用性也不高。從這個(gè)角度考慮,如果有更好的辦法,我們可以將這個(gè)方案pass掉。再說第二種方案,第二種方案也可以解決問題,但是它暴露的問題更加明顯。如果
3、直接修改第一版本的代碼,那么很可能造成其他依賴這些代碼的代碼不能運(yùn)行,也就是存在依賴關(guān)系的約束。這個(gè)方案還不如第一個(gè)方案,所以我們毫不猶豫的把它pass!兩種方案都被否定了,下面就是適配器模式上場了。適配器模式作用:將一個(gè)接口轉(zhuǎn)化為客戶端希望的另一個(gè)接口,使得原本由于接口不相容的兩個(gè)類,可以相互配合的一起工作。主要就是起一個(gè)轉(zhuǎn)換器的作用,目的就是復(fù)用原來的功能,說白了就是讓兩個(gè)接口匹配起來。想想看,適配器的作用在生活中很常見,比如管道轉(zhuǎn)接頭,三相插座插口轉(zhuǎn)換器等。這就是適配器模式出現(xiàn)的背景...下面我們看一下代碼的實(shí)現(xiàn):首先看一下日志模型類(JavaBean)
4、:packagemode.adaptor;/***這是日志對象的模型簡化點(diǎn)寫,只有操作人和操作**@authorroot**/publicclassLogModel{privateStringuuid;privateStringoperator;//操作人privateStringoperate;//操作privateStringtimestamp;//操作時(shí)間publicStringgetUuid(){returnuuid;}publicvoidsetUuid(Stringuuid){this.uuid=uuid;}publicStringgetOperat
5、or(){returnoperator;}publicvoidsetOperator(Stringoperator){this.operator=operator;}publicStringgetOperate(){returnoperate;}publicvoidsetOperate(Stringoperate){this.operate=operate;}publicStringgetTimestamp(){returntimestamp;}publicvoidsetTimestamp(Stringtimestamp){this.timestamp=tim
6、estamp;}publicStringtoString(){return"用戶"+this.getOperator()+"在"+this.getTimestamp()+"做了"+this.getOperate()+"操作";}}然后在看一下Version1.0的日志系統(tǒng)接口,面向文件的:packagemode.adaptor;importjava.util.List;/***文件日志系統(tǒng)的操作接口*@authorroot**/publicinterfaceFileLogger{publicListreadLog();publicvoidw
7、riteLog(LogModelmodel);}以及具體實(shí)現(xiàn):packagemode.adaptor;importjava.util.List;/***文件日志操作的簡單實(shí)現(xiàn)*@authorroot**/publicclassFileLoggerImplimplementsFileLogger{@OverridepublicListreadLog(){System.out.println("讀取日志文件內(nèi)容....");returnnull;}@OverridepublicvoidwriteLog(LogModelmodel){System
8、.out.println("寫入日志文