為什么要重寫?其實(shí)設(shè)計(jì)模式已經(jīng)被寫爛了责蝠,基本上党巾,網(wǎng)絡(luò)上都是一抄一大篇,當(dāng)然霜医,我之前也是用了很多別人的文章(還好備注了齿拂,是別人寫的,不然就是抄襲了)支子!我重寫的原因创肥,其實(shí)是想加入一些自己平時(shí)學(xué)習(xí),工作中值朋,遇到的情況。然后怎么想到用這個(gè)模式巩搏,或者我用了某個(gè)模式昨登,后來一查,臥槽贯底,原來早就有人這么用了丰辣。
我就不按網(wǎng)上那些資料寫了,按自己的方式寫了禽捆。
先說一下場景吧笙什,我一個(gè)項(xiàng)目中,用到了藍(lán)牙胚想。其中一個(gè)模塊是:藍(lán)牙掃描功能,偽代碼是這樣的
1.檢查藍(lán)牙是否開啟
if(bleIsOpen){
1.1藍(lán)牙開啟:掃描附近藍(lán)牙
scanBle()
}else{
1.2藍(lán)牙未開啟:打開藍(lán)牙
openBle()
}
2.處理藍(lán)牙掃描結(jié)果
doScanResult(Device device)
掃描模塊基本的功能就是這樣琐凭,但是,在1.1這一步的時(shí)候浊服,發(fā)現(xiàn)统屈,掃描這個(gè)功能胚吁,其實(shí),是有幾種情況的愁憔,
首先是低功率和正常功率問題:這是藍(lán)牙的掃描模式腕扶,低功率模式,快吨掌,省電半抱,但(不穩(wěn)定,但這個(gè)問題膜宋,通常會(huì)忽略窿侈,因?yàn)榫退悴环€(wěn)定,但基本能連上)激蹲,正常功率模式相對慢棉磨,耗電,但穩(wěn)定;
然后就是版本問題学辱,高版本API和低版本API之間的不兼容:Android5.0之后乘瓤,有一種更高效,更穩(wěn)定的低功率掃描策泣,但是低版本衙傀,沒有這一套API。
針對上述問題萨咕,所以统抬,就需要重新做一些調(diào)整。
1.檢查藍(lán)牙是否開啟
if(bleIsOpen){
1.1藍(lán)牙開啟:掃描附近藍(lán)牙
1.1.1根據(jù)API版本高版本還是低版本掃描模式
if(isHeigh){
scanBleByHeighAPI()
}else{
scanBleByNorAPI()
}
}else{
1.2藍(lán)牙未開啟:打開藍(lán)牙
openBle()
}
2.處理藍(lán)牙掃描結(jié)果
doScanResult(Device device)
這個(gè)時(shí)候危队,網(wǎng)上的資料通常會(huì)說聪建,這樣改之后,還是會(huì)有問題的茫陆,就是如果后面又有新的掃描模式金麸,又要加判斷,破環(huán)結(jié)構(gòu)什么的簿盅。說實(shí)話挥下,其實(shí),個(gè)人覺得桨醋,這個(gè)理由不夠充分棚瘟,我真不會(huì)為了這個(gè)東西,去強(qiáng)行改代碼喜最。因?yàn)橘苏海退氵@么寫,又有什么關(guān)系,業(yè)務(wù)照樣是能實(shí)現(xiàn)的禀苦。
但是蔓肯,我還是要在改一下,原因是:
1.從代碼閱讀和業(yè)務(wù)代碼的角度而言振乏,應(yīng)該更純粹一點(diǎn)蔗包。業(yè)務(wù)代碼,只寫業(yè)務(wù)慧邮。因?yàn)檫@里调限,掃描和處理掃描結(jié)果,都是屬于業(yè)務(wù)代碼误澳,但是耻矮,怎么掃描,怎么處理結(jié)果忆谓,那是實(shí)現(xiàn)的問題裆装,應(yīng)該抽取出去。
2.掃描和處理結(jié)果倡缠,應(yīng)該是成對的(或許結(jié)果都是一樣哨免,但是不排除,API的處理方式不同昙沦,或者有什么新的更新琢唾,導(dǎo)致處理方式不同,這一點(diǎn)是因?yàn)槌粤税俣鹊貓DAPI的虧)
ok盾饮,就這兩個(gè)理由采桃,讓我決定要改它。
然后丘损,我就這樣改了
當(dāng)然普办,代碼沒有寫得很完整,旨在描述這個(gè)過程徘钥,業(yè)務(wù)泌豆。
好了,最后再總結(jié)一下(網(wǎng)上那些一抄一大篇的寫法):
優(yōu)點(diǎn)
模板方法模式通過把不變的行為搬移到超類吏饿,去除了子類中的重復(fù)代碼。
子類實(shí)現(xiàn)算法的某些細(xì)節(jié)蔬浙,有助于算法的擴(kuò)展猪落。
通過一個(gè)父類調(diào)用子類實(shí)現(xiàn)的操作,通過子類擴(kuò)展增加新的行為畴博,符合“開放-封閉原則”笨忌。
缺點(diǎn)
每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的個(gè)數(shù)的增加俱病,設(shè)計(jì)更加抽象官疲。
適用場景
在某些類的算法中袱结,用了相同的方法,造成代碼的重復(fù)途凫。
控制子類擴(kuò)展垢夹,子類必須遵守算法規(guī)則。
上述维费,是網(wǎng)上抄過來的果元,基本都是這么寫的。面試犀盟,可以這樣答而晒,不過,感覺沒什么卵用阅畴。
但是倡怎,我自己的總結(jié)是:
優(yōu)點(diǎn)
業(yè)務(wù)代碼在父類(抽象類),技術(shù)代碼(實(shí)現(xiàn))在子類贱枣;
調(diào)用更簡單监署,忽略細(xì)節(jié),直觀業(yè)務(wù)邏輯冯事;
缺點(diǎn)
不會(huì)用焦匈,你就寫不來。(什么子類多之類的問題昵仅,只要你把包分好了缓熟,歸類做好,也不存在的)
場景:
看個(gè)人理解摔笤,我已經(jīng)舉了一個(gè)工作中的實(shí)例了够滑。基本來說就是吕世,同一個(gè)功能(方法)彰触,多種實(shí)現(xiàn)方式,用這個(gè)命辖,基本都可以况毅。