亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

接口和類到底怎么選?從語法差異到項(xiàng)目實(shí)戰(zhàn)一次講透

接口和類到底怎么選?從語法差異到項(xiàng)目實(shí)戰(zhàn)一次講透 接口和類的區(qū)別這話題我在各種技術(shù)群里看人吵了無數(shù)次了。每次一聊到“什么時(shí)候用接口什么時(shí)候用抽象類什么時(shí)候我就直接寫個(gè)普通類拉倒”總有老哥能從古早的Java教材一路談到項(xiàng)目里那坨只可意會(huì)不可言傳的祖?zhèn)鞔a。我自己帶過幾個(gè)項(xiàng)目見過把接口用成擺設(shè)的也見過把接口拆得比樂高還碎、一個(gè)功能恨不得定義五個(gè)接口的設(shè)計(jì)潔癖說實(shí)話這兩個(gè)概念沒在真實(shí)項(xiàng)目里頓悟過一兩回靠背面試題是真的很難吃透。今天不聊教科書就著這些年踩過的坑和對(duì)源碼的一些理解把“接口”和“類”這件事一次性捋清楚。這篇內(nèi)容不挑語言基礎(chǔ)只要你在寫Java、C、PHP、Python或者其他什么面向?qū)ο蟮恼Z言都應(yīng)該能從中撈到點(diǎn)有用的東西。我會(huì)從底層邏輯、語法差異、設(shè)計(jì)思路一直到項(xiàng)目落地時(shí)的選型判斷逐層拆開來說。哪怕是剛學(xué)會(huì)寫類的小白看完也應(yīng)該能建立起一套自己的判斷標(biāo)準(zhǔn)而不是死記硬背“接口不能實(shí)例化、類可以實(shí)例化”這種口訣。1. 先建立認(rèn)知接口和類的本質(zhì)分工要理解它們的區(qū)別不能先背語法表。先想清楚一個(gè)問題類到底是什么接口又到底是什么類本質(zhì)上是一個(gè)“具體的東西”。它把狀態(tài)和行為打包在一起。狀態(tài)是字段、屬性行為是方法。你new一個(gè)類出來它就是一塊真實(shí)的、有內(nèi)存形態(tài)的對(duì)象。比如“寶馬汽車”這個(gè)類它有顏色、有排量、有方向盤能啟動(dòng)能剎車。你說“給我造一輛寶馬”它得真能造出來。接口本質(zhì)上是一份“契約”。它不負(fù)責(zé)任何具體實(shí)現(xiàn)只負(fù)責(zé)規(guī)定“你必須能做什么”。比如“可駕駛”這個(gè)接口規(guī)定你必須有“啟動(dòng)”和“剎車”這兩個(gè)能力但至于你是用內(nèi)燃機(jī)啟動(dòng)還是用電動(dòng)機(jī)啟動(dòng)接口不管。你說“我要一個(gè)可駕駛的東西”可能來的是寶馬也可能來的是拖拉機(jī)。這樣一說區(qū)別就很顯然了類解決的是“怎么做”的問題接口解決的是“能做什么”的問題。我在項(xiàng)目里見過很多人犯一個(gè)認(rèn)知錯(cuò)誤一上來定義了個(gè)接口接口里寫了十來個(gè)方法然后找了一個(gè)實(shí)現(xiàn)類把所有方法都實(shí)現(xiàn)了一遍從此這個(gè)接口就再也沒被第二個(gè)類用過。這種接口的意義幾乎為零。接口的價(jià)值不在于“我定義了個(gè)類型”而在于“多個(gè)完全不相關(guān)的類因?yàn)楣蚕硗环萜跫s從而可以被統(tǒng)一調(diào)度”。再往深一點(diǎn)說類和接口的分工也決定了它們?cè)谙到y(tǒng)中扮演的角色不同。類是你系統(tǒng)的“血肉”負(fù)責(zé)承載業(yè)務(wù)復(fù)雜度、處理數(shù)據(jù)、組織邏輯。接口是你系統(tǒng)的“骨架”負(fù)責(zé)定義邊界、穩(wěn)定協(xié)作關(guān)系。架構(gòu)設(shè)計(jì)的時(shí)候你要先搭骨架再填血肉而不是先把血肉堆成一團(tuán)再試圖反推骨架。這就是為什么大廠里常見的設(shè)計(jì)是先定義接口再討論實(shí)現(xiàn)類。我從實(shí)際項(xiàng)目里的感受是當(dāng)你發(fā)現(xiàn)自己開始糾結(jié)“這個(gè)接口到底該怎么命名才能涵蓋未來所有可能”的時(shí)候你大概率是被設(shè)計(jì)潔癖綁架了。接口是簡(jiǎn)潔的承諾不是無所不包的預(yù)言。承諾得越少系統(tǒng)越容易演化。2. 語法層面的硬核區(qū)別聊完認(rèn)知來硬的。語法層面接口和類的差異在各個(gè)語言里大同小異但以Java最為典型。我直接用表格把關(guān)鍵差異列出來再逐個(gè)展開講。對(duì)比項(xiàng)類Class接口Interface實(shí)例化可以new不能new方法實(shí)現(xiàn)方法可以有實(shí)現(xiàn)Java 8前不能有實(shí)現(xiàn)Java 8后可有default/static方法字段可有任意狀態(tài)字段只能有public static final常量構(gòu)造方法有沒有繼承/實(shí)現(xiàn)類單繼承類接口多繼承接口類可多實(shí)現(xiàn)接口訪問修飾符可自由指定方法默認(rèn)public抽象程度具體類實(shí)現(xiàn)完整邏輯抽象類可留抽象方法全是約定沒有具體狀態(tài)先來說最關(guān)鍵的多重繼承問題。Java的類只能單繼承這是為了防止菱形繼承搗亂。但接口可以多實(shí)現(xiàn)一個(gè)類可以implements好幾個(gè)接口就像“一個(gè)人可以既是司機(jī)又當(dāng)廚師還兼職攝影師”一樣幾個(gè)契約之間互不打架。C里類的多繼承則是直接把菱形繼承問題交給了程序員用虛繼承才能避免二義性很多C老手都栽過這個(gè)坑。然后是抽象類。這個(gè)經(jīng)常和接口混淆。抽象類是“不完整的類”它已經(jīng)是類了有構(gòu)造方法、有字段、有部分實(shí)現(xiàn)只是其中有些方法沒有實(shí)現(xiàn)留到子類去填。它和接口的區(qū)別本質(zhì)上是抽象類關(guān)心的是“你是誰”接口關(guān)心的是“你能干嘛”。舉個(gè)例子“動(dòng)物”是抽象類因?yàn)樗形锓N屬性、身高體重這些狀態(tài)也有叫喚這個(gè)抽象方法而“會(huì)飛”是接口蝙蝠和蝴蝶都能實(shí)現(xiàn)它但相處沒有任何血緣關(guān)系。如果你心里裝著“is-a”關(guān)系用抽象類如果你是“has-a能力”、“can-do行為”用接口。字段這塊也很多人記錯(cuò)。接口里的字段不管你寫不寫修飾符它最終都是public static final。這意味著接口不能有狀態(tài)它的“常量”其實(shí)是為了協(xié)議定義服務(wù)的比如定義版本號(hào)、默認(rèn)配置、狀態(tài)碼。而類的字段就是真正參與對(duì)象的生命周期和業(yè)務(wù)邏輯的。所以你要把可變狀態(tài)塞進(jìn)接口里語法層面直接就不允許。這也從另一個(gè)角度說明接口是穩(wěn)定的契約不允許被狀態(tài)污染。還有一點(diǎn)容易被忽略構(gòu)造方法。類必須有構(gòu)造方法哪怕默認(rèn)的無參構(gòu)造它也存在因?yàn)橐獙?shí)例化就要走構(gòu)造流程。接口壓根沒有構(gòu)造方法因?yàn)樗烊痪筒皇怯脕怼吧蓪?duì)象”的。有些人會(huì)問匿名內(nèi)部類實(shí)現(xiàn)接口的時(shí)候好像寫了構(gòu)造邏輯那是類在構(gòu)造不是接口在構(gòu)造。你new的對(duì)象其實(shí)是編譯器幫你生成的匿名類不是接口本身。再說說抽象類的“類屬性”帶來的一些后果。因?yàn)榻涌诓荒苡袑?shí)例字段所以在需要“攜帶狀態(tài)”的抽象設(shè)計(jì)上接口就很別扭。比如你要抽象一個(gè)連接池池里有大小、繁忙計(jì)數(shù)這些狀態(tài)這用接口定義起來就很不舒服。這時(shí)候抽象類甚至普通基類就更合適。這是我這兩年做中間件封裝時(shí)最深刻的體會(huì)接口適合定義“通道”抽象類適合定義“底座”。3. 語法之外設(shè)計(jì)層面的差異才是靈魂語法區(qū)別背得再熟寫不出好代碼也白搭。接口和類真正的區(qū)別在設(shè)計(jì)中體現(xiàn)得更兇。在項(xiàng)目里我見過一個(gè)最常見的反派面向?qū)崿F(xiàn)編程。調(diào)用方直接依賴某個(gè)具體的類比如HashMap用得爽就直接把HashMap當(dāng)參數(shù)類型傳遍天涯海角。結(jié)果下一次需求要換并發(fā)安全的Map所有方法簽名都得跟著改光改類型就能改一天。這就是典型的“類依賴”帶來的耦合。而面向接口編程核心是依賴倒置高層模塊不依賴低層模塊兩者都依賴抽象。你把Map接口當(dāng)成方法參數(shù)類型傳HashMap也好ConcurrentHashMap也罷調(diào)用方一概不感知。這時(shí)候接口就是你給代碼之間加的“緩沖墊”讓兩邊可以各自演化?;卣{(diào)機(jī)制是接口在實(shí)際業(yè)務(wù)中最典型的應(yīng)用?;卣{(diào)的本質(zhì)是某個(gè)模塊在事件發(fā)生的時(shí)候調(diào)用你注冊(cè)進(jìn)來的代碼。Java里最古典的回調(diào)方式就是定義一個(gè)接口把方法實(shí)現(xiàn)傳出去。比如你給按鈕注冊(cè)點(diǎn)擊事件public interface OnClickListener { void onClick(View v); } button.setOnClickListener(new OnClickListener() { Override public void onClick(View v) { // 點(diǎn)按之后具體干什么 } });看到?jīng)]OnClickListener是個(gè)接口它做的事情就是定義“點(diǎn)擊事件到了之后你要干什么”的契約。按鈕這個(gè)類自己不關(guān)心你干了什么它只負(fù)責(zé)在點(diǎn)擊的時(shí)候喊一嗓子“onClick”然后具體執(zhí)行什么邏輯全由調(diào)用方實(shí)現(xiàn)。到了JDK 8之后Java引入了lambda和函數(shù)式接口這種“只定義契約不實(shí)現(xiàn)邏輯”的模式被發(fā)揮到了極致。函數(shù)式接口就是只有一個(gè)抽象方法的接口lambda表達(dá)式本質(zhì)上就是這種接口的匿名實(shí)現(xiàn)。比如list.stream().filter(x - x 5).forEach(System.out::println);這里filter接收的是PredicateIntegerforEach接收的是ConsumerInteger這對(duì)只關(guān)注語法的人來說可能沒什么感覺但對(duì)理解接口的人來說這就是接口的現(xiàn)代形態(tài)一個(gè)接口不再非要聲明成“某某Service”它完全可以是一個(gè)語義單一的普通接口用來承載一個(gè)函數(shù)級(jí)別的契約。也是因?yàn)檫@種設(shè)計(jì)Kotlin里干脆把lambda和接口玩成了一個(gè)東西你甚至可以拿lambda去替代大部分單方法接口。再比如Android開發(fā)里常見的“回調(diào)轉(zhuǎn)掛起工具類”。協(xié)程的suspendCancellableCoroutine本質(zhì)上就是把你那個(gè)回調(diào)式的接口轉(zhuǎn)換成一種掛起函數(shù)。背后的邏輯就是接口在這兒是一種“通道”它接收外部產(chǎn)生的事件你的工具類負(fù)責(zé)把這個(gè)通道轉(zhuǎn)成協(xié)程能響應(yīng)的東西。如果離開了接口這個(gè)抽象壓根不可能完成這種跨范式的轉(zhuǎn)換。接口的威力就在這里它在各種編程范式之間當(dāng)翻譯官。那類在設(shè)計(jì)層面的定位是什么呢類適合承擔(dān)“實(shí)體建?!焙汀熬唧w策略”的角色。在策略模式里接口定義“策略”的骨架不同的類填充不同的算法細(xì)節(jié)。比如支付方式PaymentStrategy是接口微信支付、支付寶支付、銀行卡支付是不同類。調(diào)用方拿著接口類型運(yùn)行時(shí)塞進(jìn)哪個(gè)實(shí)現(xiàn)執(zhí)行的就是哪種支付策略。這里類的職責(zé)是提供差異化的實(shí)現(xiàn)方案接口的職責(zé)是統(tǒng)一它們的對(duì)外形態(tài)。再說一個(gè)很多人容易產(chǎn)生誤會(huì)的點(diǎn)接口和類的設(shè)計(jì)視角。類是自下而上的你看到業(yè)務(wù)里有一個(gè)具體的東西你把它的屬性和行為歸納出來形成一個(gè)類。接口是自上而下的你先定義好系統(tǒng)內(nèi)角色之間的協(xié)作關(guān)系再把“誰能承擔(dān)這個(gè)角色”的設(shè)計(jì)要求投射給實(shí)現(xiàn)方。所以我們做架構(gòu)的時(shí)候順序往往是先寫接口再寫實(shí)現(xiàn)類。順序反了你就是在給代碼寫事后說明而不是在做設(shè)計(jì)。4. 不同語言生態(tài)下接口與類的變體對(duì)比接口和類的區(qū)別不是Java的專享話題。在每個(gè)語言里這兩者都有自己變了個(gè)樣子的表達(dá)方式搞懂它們有個(gè)共同內(nèi)核對(duì)你切換到其他語言會(huì)非常有幫助。Java接口語法演進(jìn)最典型。JDK 7時(shí)代接口只能有抽象方法一個(gè)方法都不能實(shí)現(xiàn)。JDK 8引入了default方法和static方法這時(shí)候接口開始具備了一定“實(shí)現(xiàn)能力”。JDK 9之后又允許接口寫私有方法專門給default方法當(dāng)內(nèi)部工具方法用。但無論怎么演進(jìn)接口始終沒有字段、沒有狀態(tài)這條紅線從沒破過。C沒有interface這個(gè)關(guān)鍵字。C里可以用純虛類也叫抽象基類模擬接口一個(gè)類全是純虛函數(shù)沒有數(shù)據(jù)成員沒有構(gòu)造函數(shù)實(shí)現(xiàn)它就是接口。C的純虛類比Java接口更野一點(diǎn)因?yàn)樗梢杂谐蓡T函數(shù)聲明、析構(gòu)函數(shù)甚至可以在虛析構(gòu)里有默認(rèn)實(shí)現(xiàn)。還有一個(gè)區(qū)別C沒有內(nèi)置的interface和implement的區(qū)分所以它就是靠類的語法特性硬拗出了“接口”這個(gè)形態(tài)。Python走的是鴨子類型理論上不需要接口。Python講究“看到了就是”你要的是能叫的那它只要會(huì)quack()就夠了根本不關(guān)心它是鴨子還是人。這種靈活性很爽但大型項(xiàng)目里沒約束就是災(zāi)難的溫床。所以Python的標(biāo)準(zhǔn)庫提供了abcAbstract Base Classes模塊用抽象基類來疊加約束。再有就是typing.Protocol這個(gè)更神奇它是結(jié)構(gòu)性子類型不需要類顯式繼承它只要類的結(jié)構(gòu)上有對(duì)應(yīng)方法類型檢查器就認(rèn)可它符合這個(gè)協(xié)議。Python在接口這件事上更像是做“道德約束”而不是“法律約束”。PHPclass 和 interface 分得清清楚楚interface 里可以定義常量和方法簽名實(shí)現(xiàn)類用implements關(guān)鍵字。PHP有個(gè)比Java現(xiàn)代的地方接口支持常量但子類不能被 override——這在Java里其實(shí)也能做但語義上不太順。PHP里還能同時(shí)繼承類和實(shí)現(xiàn)接口誰是對(duì)誰是什么一望即知。Go嚴(yán)格來說Go不是傳統(tǒng)OOP語言但它的接口設(shè)計(jì)是我認(rèn)為最有啟發(fā)性的。Go的接口是隱式實(shí)現(xiàn)不需要你用implements聲明只要一個(gè)類的方法集合包含了接口的全部方法它就自動(dòng)實(shí)現(xiàn)了這個(gè)接口。這種“鴨子類型編譯期檢查”的組合讓接口在Go里用起來十分輕量接口成了組合的利器。我最早對(duì)接口的理解是純Java視角的后來接觸了Python和Go才意識(shí)到接口的本質(zhì)其實(shí)是“對(duì)能力的最小承諾”。不同語言只是把這同一個(gè)承諾包裝成不同的語法外衣罷了。所以面試問你“接口和類的區(qū)別”你別只背Java語法你要能把這種“契約vs實(shí)現(xiàn)”的底層認(rèn)知講出來那才是真正理解了。下面給一個(gè)多語言快速對(duì)照表語言接口實(shí)現(xiàn)方式類的繼承接口是否可含實(shí)現(xiàn)特點(diǎn)備注Javaimplements interface單繼承JDK8可含default/static嚴(yán)謹(jǐn)類型體系清晰C純虛類多繼承純虛類無實(shí)現(xiàn)但可有虛析構(gòu)強(qiáng)大但容易踩菱形繼承Python鴨子類型 ABC/Protocol多繼承抽象基類可含實(shí)現(xiàn)靈活靠自覺類型檢查PHPimplements interface單繼承可定義方法簽名與常量與Java高度類似Go隱式實(shí)現(xiàn)組合替代繼承接口通常只放方法簽名組合優(yōu)于繼承隱式自適應(yīng)5. 項(xiàng)目實(shí)戰(zhàn)怎樣的代碼才算用對(duì)了接口和類原理講再多不如看兩段真實(shí)的代碼來得直觀。我拿一個(gè)業(yè)務(wù)系統(tǒng)里特別經(jīng)典的需求來說事大家看明白之后馬上就能在自己的項(xiàng)目里用起來。假設(shè)要做多平臺(tái)的登錄對(duì)接平臺(tái)有微信、抖音、淘寶。很多人拿到需求就開始寫類新建一個(gè)WechatLoginService里面一個(gè)login()方法寫它微信授權(quán)的邏輯新建一個(gè)TiktokLoginService里面也是login()但代碼是抖音授權(quán)的邏輯。到后端的時(shí)候看起來也沒毛病就是三個(gè)類干三套活兒。但是接下來問題就來了。你的業(yè)務(wù)主流程要用統(tǒng)一的“登錄”入口你寫代碼的時(shí)候就得這樣if (platform.equals(wechat)) { wechatLoginService.login(); } else if (platform.equals(tiktok)) { tiktokLoginService.login(); }這種就是典型的面向類編程。每加一個(gè)新平臺(tái)你就要在主流程里加一分支。平臺(tái)多了之后這主流程代碼寫著寫著就成了一盤大雜燴每個(gè)分支里還可能混著各自平臺(tái)返回的用戶信息轉(zhuǎn)本系統(tǒng)的邏輯到最后沒人敢動(dòng)這塊代碼因?yàn)橐徊涣羯窬蛣?dòng)了誰的奶酪。正確的做法是用接口定義登錄的契約讓每個(gè)平臺(tái)按契約各自實(shí)現(xiàn)public interface PlatformLoginService { // 每個(gè)平臺(tái)統(tǒng)一的登錄入口 LoginResult login(LoginRequest request); // 每個(gè)平臺(tái)回調(diào)校驗(yàn)的統(tǒng)一入口 UserProfile verifyCallback(String code, MapString, String params); // 給業(yè)務(wù)方用的平臺(tái)識(shí)別 PlatformEnum platform(); }然后讓微信、抖音、淘寶各自的類去implements這個(gè)接口。主流程里只需要這樣public LoginResult login(String platform, LoginRequest request) { PlatformLoginService service serviceRegistry.get(platform); return service.login(request); }新平臺(tái)接入的時(shí)候只需要新寫一個(gè)實(shí)現(xiàn)類并且注冊(cè)到serviceRegistry里主流程一行代碼都不用改。這就是“開閉原則”對(duì)擴(kuò)展開放對(duì)修改關(guān)閉。而能把擴(kuò)展打開的那把鑰匙就是接口。我再補(bǔ)充一個(gè)我在真實(shí)項(xiàng)目里踩過的坑。很多人確實(shí)會(huì)模仿這個(gè)寫法創(chuàng)建接口但實(shí)現(xiàn)類里干的一件事是把接口里定義的方法參數(shù)、返回值類型直接用自己家的自定義類比如LoginResult這個(gè)類型是微信平臺(tái)定制的里面有微信特有的字段。結(jié)果其他平臺(tái)想實(shí)現(xiàn)的時(shí)候發(fā)現(xiàn)返回值根本沒法用只能往這個(gè)類里硬塞一堆null字段。接口一旦被具體實(shí)現(xiàn)“劫持”了類型定義它就不再是契約了而是一張某實(shí)現(xiàn)類的皮。這里特別考驗(yàn)設(shè)計(jì)者的火候接口里的類型必須是通用抽象層的東西不能是某個(gè)實(shí)現(xiàn)專屬的東西。再說一個(gè)很多人的疑問接口和類在實(shí)際底層源碼里編譯器是怎么處理它們的關(guān)系的Java里interface編譯之后也會(huì)生成一個(gè).class文件和普通類的字節(jié)碼格式基本一致。關(guān)鍵在于JVM的invokeinterface指令和invokevirtual指令兩者方法分派的邏輯不同。接口方法是JVM運(yùn)行時(shí)動(dòng)態(tài)找具體實(shí)現(xiàn)類的走的是“它得先確認(rèn)你能調(diào)這個(gè)接口方法”的路徑所以直接用接口引用調(diào)用方法會(huì)走invokeinterface性能上會(huì)比invokevirtual稍微差一丁點(diǎn)。現(xiàn)代JVM會(huì)做各種優(yōu)化比如內(nèi)聯(lián)緩存這點(diǎn)差異在絕大多數(shù)業(yè)務(wù)場(chǎng)景里幾乎可以忽略不計(jì)。但面試官如果問到“接口方法和類方法的JVM調(diào)用區(qū)別”能答到這個(gè)層次絕對(duì)是個(gè)加分項(xiàng)。6. 避坑指南實(shí)踐中常見的選型問題與排查思路聊到具體項(xiàng)目里的經(jīng)驗(yàn)必須得把那些年寫代碼時(shí)流過的血淚一并說出來。這里我整理幾個(gè)高頻踩坑場(chǎng)景方便各位直接對(duì)照。第一個(gè)問題接口越抽象越好嗎不是。接口定義的粒度應(yīng)該和業(yè)務(wù)協(xié)作的真實(shí)需求匹配。我見過有人為了“可擴(kuò)展性”把接口方法拆到極細(xì)一個(gè)doStep1()、一個(gè)doStep2()、一個(gè)doStep3()。結(jié)果實(shí)現(xiàn)類根本沒幾個(gè)反倒是調(diào)用方要組合調(diào)用一堆接口方法才能完成一個(gè)完整業(yè)務(wù)動(dòng)作。好的接口應(yīng)該是“一次調(diào)用完成一個(gè)完整業(yè)務(wù)動(dòng)作”而不是把動(dòng)作的每一個(gè)細(xì)節(jié)都暴露出去。接口是給外部看的門面不是給內(nèi)部看的結(jié)構(gòu)。第二個(gè)問題如何判斷該用接口還是抽象類看兩個(gè)東西一看是否有狀態(tài)要共享二看子類之間是否天然互相替換。如果這些類有一個(gè)共同的“身份”比如都是數(shù)據(jù)庫驅(qū)動(dòng)、都是消息中間件客戶端而且它們需要共享連接池、配置加載這類基礎(chǔ)設(shè)施字段那就用抽象類作為基類。如果這些類的能力是一致的但實(shí)現(xiàn)完全八竿子打不著比如日志記錄器、序列化器、緩存都是“插拔式能力”那就是接口的菜。有一個(gè)很土的判斷口訣我一直拿它救命抽象類適合“都是XX”接口適合“都能XX”。都是動(dòng)物都能飛前者用抽象類后者用接口。都能序列化、都能緩存、都能登錄找接口都是一個(gè)體系的通信協(xié)議、都有公共的連接管理字段找抽象類。第三個(gè)問題接口方法參數(shù)的校驗(yàn)要放在哪一層這是特別容易被忽視的點(diǎn)。很多初學(xué)者把實(shí)現(xiàn)類內(nèi)部做了一堆if (request null) throw new IllegalArgumentException()這種防御性代碼。老實(shí)說不是不行但更好的做法是接口方法的javadoc里明確說明參數(shù)約束實(shí)現(xiàn)類再各自校驗(yàn)。但如果你把校驗(yàn)放在接口層上比如default方法里做通用校驗(yàn)?zāi)悄憔涂梢詫?shí)現(xiàn)全局統(tǒng)一約束不會(huì)出現(xiàn)微信實(shí)現(xiàn)校驗(yàn)了、抖音實(shí)現(xiàn)忘了校驗(yàn)這種“同一接口實(shí)現(xiàn)之間約束不一致”的鬧劇。Java 8允許接口寫default方法就是干這個(gè)用的。第四個(gè)問題接口里突然要加一個(gè)方法怎么辦這是老Java程序員的最痛。假設(shè)你的接口已經(jīng)被幾十個(gè)實(shí)現(xiàn)類繼承了現(xiàn)在新需求要求所有實(shí)現(xiàn)類必須支持“導(dǎo)出”。你往接口里一加抽象方法所有實(shí)現(xiàn)類全部編譯報(bào)錯(cuò)。這里有兩個(gè)方案但都得分清代價(jià)方案一把新方法聲明為default方法并給一個(gè)合理的默認(rèn)實(shí)現(xiàn)比如直接throw new UnsupportedOperationException(當(dāng)前實(shí)現(xiàn)不支持導(dǎo)出)。好處是改動(dòng)極小壞處是有些實(shí)現(xiàn)類可能悄悄“不支持”但不報(bào)錯(cuò)屬于靜默失敗。方案二忍受一次全量修改。把方法加進(jìn)去然后跑到每個(gè)實(shí)現(xiàn)類里編譯報(bào)錯(cuò)了一個(gè)個(gè)補(bǔ)。適合實(shí)現(xiàn)類不太多并且每個(gè)都得真正實(shí)現(xiàn)的情況。我個(gè)人的經(jīng)驗(yàn)是能預(yù)計(jì)到未來會(huì)有哪些變法的接口定義的時(shí)候盡量窄真到擴(kuò)展的那一天寧可新建一個(gè)子接口不要?jiǎng)永系慕涌?。比如定義UserQueryService放查詢方法再定義UserCommandService extends UserQueryService放寫操作方法。這樣老實(shí)現(xiàn)類不受影響新實(shí)現(xiàn)類按需選擇實(shí)現(xiàn)哪個(gè)接口。接口的演進(jìn)策略本質(zhì)上也是一個(gè)系統(tǒng)的演進(jìn)策略。第五個(gè)問題接口和類在“類加載”這個(gè)環(huán)節(jié)有什么關(guān)系這個(gè)話題挺冷門但接熱詞聊一下。Java的類加載機(jī)制對(duì)類和接口都有效但兩者有個(gè)細(xì)微差別類的初始化會(huì)觸發(fā)靜態(tài)塊、靜態(tài)字段賦值接口也有初始化機(jī)制但接口的初始化只發(fā)生在使用到接口里的常量/靜態(tài)字段時(shí)且接口沒有靜態(tài)代碼塊。所以在排查“為什么接口里的常量死活不生效”或“接口的static字段為null”這類問題時(shí)第一反應(yīng)就是去看看類加載順序和初始化時(shí)機(jī)是否因?yàn)橐梅绞讲煌a(chǎn)生了差異。這個(gè)一般出現(xiàn)在搞模塊化、自定義ClassLoader、熱部署的場(chǎng)景。平時(shí)寫業(yè)務(wù)估計(jì)感覺不到但面試和排查疑難雜癥時(shí)這是拉開差距的知識(shí)點(diǎn)。第六個(gè)問題IDE里怎么快速查一個(gè)import的類到底是從哪個(gè)依賴包來的這個(gè)看似和接口類區(qū)別沒關(guān)系但實(shí)際干活時(shí)天天用到。比如項(xiàng)目里有兩個(gè)jar包都定義了UserService接口你的import com.xxx.UserService到底引的是誰在IDEA里直接按CtrlN或輸入類名后CtrlAlt組合鍵看彈出框能全局搜類但要看類的來源最直接的方法是光標(biāo)點(diǎn)在那個(gè)import上按F4跳到定義處右側(cè)Project面板會(huì)自動(dòng)顯示當(dāng)前類所在的jar包位置或者直接看左下角Project標(biāo)簽頁里的External Libraries。還有一個(gè)快捷鍵是CtrlAltB跳到實(shí)現(xiàn)處用它能確認(rèn)實(shí)現(xiàn)類和接口的從屬關(guān)系這在排查“為什么這里注入的實(shí)現(xiàn)不是我以為的那個(gè)”時(shí)特別管用。再補(bǔ)充一個(gè)和“接口冪等性”相關(guān)的點(diǎn)。很多人在設(shè)計(jì)接口這里就指HTTP API了的時(shí)候把冪等性理解成“后端做個(gè)去重表”。其實(shí)接口HTTP冪等性和你代碼里的接口/類的設(shè)計(jì)也有呼應(yīng)。HTTP接口本質(zhì)也是“契約”說好這個(gè)接口是冪等的那它就是冪等的不管調(diào)用方重試多少次服務(wù)端都應(yīng)該保證業(yè)務(wù)結(jié)果一致。這和Java接口的設(shè)計(jì)理念一樣契約說出去的話實(shí)現(xiàn)類必須無條件遵守。所以一個(gè)實(shí)現(xiàn)類里如果沒實(shí)現(xiàn)好冪等那不是HTTP的問題是你把“契約”簽壞了。凡是寫對(duì)外API必須在接口設(shè)計(jì)文檔里寫明冪等語義而不是指望調(diào)用方講武德。7. 現(xiàn)代工具鏈上的工程實(shí)踐聊完語法和設(shè)計(jì)再補(bǔ)一段現(xiàn)代工程里接口和類的真實(shí)應(yīng)用場(chǎng)景特別是接口配置、接口文檔、接口測(cè)試這類“接口”的另一個(gè)維度。熱詞里有個(gè)“多源倉庫接口配置”很多人可能一臉懵感覺像是某種神秘功能。其實(shí)它就是很常見的“配置驅(qū)動(dòng)”模式原來你的代碼里硬編碼了調(diào)用哪個(gè)數(shù)據(jù)源、哪個(gè)倉庫地址現(xiàn)在把這些東西抽出來通過外部配置文件動(dòng)態(tài)指定。這個(gè)“接口”不是Java的interface更像是一個(gè)“配置條目”它是系統(tǒng)對(duì)外暴露的接入點(diǎn)。這種模式對(duì)接口和類的設(shè)計(jì)啟示在于接口不僅是代碼層面的關(guān)鍵字更是系統(tǒng)層面的“對(duì)外協(xié)議”。比如你做數(shù)據(jù)聚合要對(duì)接多個(gè)外部API源每個(gè)源的數(shù)據(jù)格式、認(rèn)證方式、限流策略都不一樣。你可以為每個(gè)API源寫一個(gè)實(shí)現(xiàn)類然后通過配置文件把“哪個(gè)源用哪個(gè)實(shí)現(xiàn)類”映射起來。Java里可以用SPIService Provider Interface機(jī)制或者干脆用Spring的配置文件策略注入讓接口在運(yùn)行時(shí)動(dòng)態(tài)綁定到指定實(shí)現(xiàn)。這樣操作的一個(gè)好處是以后要接入一個(gè)新的數(shù)據(jù)源不用改主流程代碼部署完新實(shí)現(xiàn)的jar包或者僅僅是調(diào)整配置系統(tǒng)就能自動(dòng)感知新源。這就是把“類”作為實(shí)現(xiàn)單元把“接口”作為集成單元的理想形態(tài)。我做數(shù)據(jù)中臺(tái)的時(shí)候這套配置驅(qū)動(dòng)方式救了不少急改配置而不重新發(fā)版的能力在線上問題處理時(shí)實(shí)在太珍貴了。接口文檔也是一樣。你現(xiàn)在寫好接口定義后續(xù)的實(shí)現(xiàn)類都是“履約”。所以對(duì)工程團(tuán)隊(duì)來說文檔先行、接口先行遠(yuǎn)比代碼先行靠譜。我用過的做法是先定義好接口類和DTO數(shù)據(jù)傳輸對(duì)象寫清楚每個(gè)接口的入?yún)ⅰ⒊鰠?、異常語義甚至直接用OpenAPI注解把接口描述掛上去然后讓不同人并行去寫實(shí)現(xiàn)類。這樣團(tuán)隊(duì)協(xié)作時(shí)大家對(duì)“契約”的理解是一致的不會(huì)出現(xiàn)A寫的實(shí)現(xiàn)期望傳入的是userIdB寫的調(diào)用方傳的是用戶對(duì)象這種雞同鴨講的情況。這也從工程管理的角度印證了接口和類的關(guān)系接口在協(xié)作流程里就是大家共同對(duì)齊的“合同”。日志也是一個(gè)被忽略的視角。很多團(tuán)隊(duì)的日志打印得亂七八糟其中一個(gè)原因就是用接口還是用類導(dǎo)致了日志歸屬混亂。如果你在接口類里通過LoggerFactory.getLogger(this.getClass())來取日志那么日志會(huì)正確落到具體實(shí)現(xiàn)類的名字上排查問題的時(shí)候非常有幫助。反過來如果你在某一個(gè)工具類里硬編碼了日志名那所有走這個(gè)工具類的日志都會(huì)混在一起。所以接口和類在工程落地時(shí)連日志這種細(xì)枝末節(jié)都會(huì)影響可維護(hù)性。我自己的習(xí)慣是不要在接口里定義靜態(tài)日志那沒有意義日志Logger一律放在具體類中且用this.getClass()動(dòng)態(tài)獲取保證日志歸屬永遠(yuǎn)清晰。8. 經(jīng)驗(yàn)總結(jié)與小技巧寫到這里也差不多了。把最核心的幾件事用最簡(jiǎn)單的話收個(gè)尾。實(shí)際開發(fā)中我內(nèi)心始終帶著這樣一條判斷鏈路拿到一個(gè)需求先想“業(yè)務(wù)里有沒有多個(gè)實(shí)現(xiàn)要隨時(shí)切換、有沒有跨系統(tǒng)的協(xié)作點(diǎn)”如果有那就先定義接口再想“這幾個(gè)類有沒有公共字段和公共邏輯可以沉淀到基類”如果有那就在抽象類或普通基類里做沉淀最后才輪到普通類的具體業(yè)務(wù)邏輯落地。順序反了寫著寫著就擰巴了。一個(gè)小技巧送給大家寫完一個(gè)接口或者類之后退一步看一眼它的名字。接口的名字應(yīng)該像形容詞可飛的、可序列化的、可登錄的類的名字應(yīng)該像名詞微信登錄服務(wù)、數(shù)據(jù)庫連接池、訂單實(shí)體。如果你的接口叫LoginServiceImpl那你肯定是在用類思維寫接口。如果你的類叫SomeAbility那你可能是在用接口思維寫類。這個(gè)判斷方法我從沒失手過。還有一個(gè)我經(jīng)常安利給新同事的快速審查法把接口的所有方法都改成“返回void”然后看看調(diào)用方還怎么用。如果調(diào)用方一下子就不知道怎么組織代碼了說明接口的方法設(shè)計(jì)得偏底層、偏細(xì)節(jié)顆粒度不對(duì)如果調(diào)用方依然能順暢地編排業(yè)務(wù)流程說明接口確實(shí)暴露的都是業(yè)務(wù)動(dòng)作。這個(gè)方法簡(jiǎn)單粗暴但特別見效果適合在做code review的時(shí)候快速捉妖。最后再多提一嘴接口和類并不是互相對(duì)立的存在它們是面向?qū)ο笤O(shè)計(jì)的一體兩面。真正的高手不會(huì)為了用接口而用接口也不會(huì)鄙視接口、覺得都是多余的。他們只是很清楚系統(tǒng)里哪些位置需要穩(wěn)定的契約哪些位置需要靈活的實(shí)體。想清楚了這個(gè)接口和類的區(qū)別自然就不需要背了因?yàn)槟阋呀?jīng)知道在代碼里它倆各該站在哪里了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷91| 亚洲中文字幕av | 极品白嫩美女白浆成人福利在线看| 啊啊啊慢点| 国产极品久久久| 久久东京国产精品视频| 福利操逼| 日本操逼视频在线| 97在线日韩中文字幕| 九色97| 国产一级作爱毛片| 十八禁视频一区二区| avav青青草久久夜| 亚洲男人天堂视频| 九区国产| 99热在线不卡| 久久久久久性爱视频| 99激情视频| 视频国产精品未满十八禁止在线观看| 一区操逼| 德国一二三不卡| 91超级碰碰| 国产伦乱91| 欧美精品23| 青青草中文字幕| 99精品九九九九九九| 久久m| 欧美91精彩| 欧美韩国你懂得在线| 亚洲欧美大香蕉| 超碰在线人妻| 啊啊啊啊啊在线观看网址| 中文字幕第页| 久久久久性熟视频| 成人久久精品| 大但人体久久久久| 久久精品无码熟妇一区二区三区视频导航 | 91粉嫩萝控精品福利网站_精品影音先锋国 | 日韩一级二级三级免费看完整版| 亚洲熟女av中文字幕| 校园春色 亚洲| 亚州欧美另类| 97精品一区二区视频| 上特色A在线| 91视频伊人| 日韩 国产 欧美自拍| 国产主播福利| 国产av美女被艹的乱叫| 五月天偷拍| 中文字幕在线播放2中文字幕在线观看2| 911粉嫩人妻| 福利在线观看一区二区| 成人综合久久精品色婷婷| 久久亚洲婷婷| 大香蕉中文aV在线| 凹凸 69堂 在线播放| 性一交一乱一交A片久久四色| 全球成人中文在线| 中文字幕av色| 中文字幕文字幕无码一区二区三区电影99 | 日韩欧美~中文字| 欧美性第1页| 久久久久久久9| 中文字幕国产在线天堂| 操逼www.| 国产蜜臀精品一区免费尤物| 麻豆国产第一| 国产福利合集| 亚洲精品久久久久久久蜜桃臀| 一块操欧美| 性站| 加勒比aⅴ| 欧美18老人禁| 久久香蕉综合一本到3atv| 国产无马av| 亚洲国男人的天堂| 桃色人妻在线视频| 丰满少妇一区二区三区免费看| 久久国产AⅤ| 性色高清..……| 亚洲成人AB| 99e久久国产精品| 2017人人操,人人摸| 国产区性爱在线视频秋霞豆| 蜜臀av在线播放一区二区三区| 情色av电影| 国产精品另类一区大香蕉| 久久久久九九九| 青娱乐久久艹| 97公开久久| 三上悠亚在线毛片91| 亚洲导航深夜福利| 亚洲日韩欧美一区二区| 偷拍 欧美 日韩| AAA久久| 嫩草 人人网精品| 一本久道久久综合狠狠爱一密臀精| 亚洲av噜噜噜噜噜噜| 伊人影院综合是一个与深夜成人在线| 国产日韩精品一区二区三区| 91青青草| 天天色悠悠激情| 中国熟女91| 精品日韩人妻精品一二三区| 成人综合色网| 东京太热男人的天堂久久久| 欧美熟女操屄| 玖玖爱伊人玖玖爱| 超碰人妻天天干| 熟女日韩| 97香蕉网| 搞中出视频在线观看| 性猛交| 99热在线观看| 综合亚洲网| 人妻熟女一区二区| 91色久| 99精品无码| 日本性爱少妇| 999精品久久久久久久| 亚洲另类电影| 亚洲在线| 国产白领连续中出在线播放| 日韩黄片视频试看| 天天躁狠狠躁av| 亚洲天堂AV在线播放| 老熟女熟妇| 大香蕉视频一二三区| 97自拍一区| 日本人妻伦在线中文字幕| 啪啪91| 97视频免费在线观看| 欧美日不卡| 天美精品原创av片国产| 神马久久69| 日本免费中文字幕在线| 欧美第五页| 久久久激情| 97亚洲精品| 一区二区三区蜜桃成人撸久久东京热| 午夜激情成人在线观看| 伊人9| 69人妻精品一区二区绯色| 亚洲图片小说欧洲| 日本丝袜美腿人妻九九| 脫衣舞一区二区三区| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 99.色网| 又大又大又大又粗爽高潮观看| 日本三级久| 欧美欧美啪啪视频| 极品出轨视频网站| 自拍二页| 长长久久88视频| 熟女乱3伦999| 欧美色青| 超碰天天操| 日本三级大片| 免费啪啪啪网站18岁| 亚洲黄色AV电影| 日韩一区二区熟女| 99久久婷婷国产综合| 岛国片在线播放| 亚洲91射| 嗯~啊~快点 死我视频| 成人七区| 综合久久97| 色欧洲97| 色婷婷综合久久中文字幕雪峰| 亚洲国产成人福利在线观看| 亚洲动态色图| 久艹视频在线| 黄网站黄视频网站进入口| 91黑人无码激情在线| 亚洲情色欧美| 亚洲色婷婷综合久久一区二区三区| 91美女视屏| 天天做日日爱夜夜爽| 免费一二区| 97国产伦理| 在线女人91| 亚洲女毛多水多21P| 97天天综合| 伊人96在线| 精品视频专区| 午夜性| 黑丝内射一区二区三区| 婷婷伊人綜合中文字幕| renqi久久久久久久久久久久| 国产操伦| 黑丝自慰喷水网站| 欧美日韩国产高清在线一二三区| 成人免费性爱视视| www国产精品| 色吊丝 日日骚 清纯唯美| 麻豆 亚洲 97| 91殴美大片| 香一区二区三区| 色啪网| 免费综合亚洲中文| 六月丁香久久| 91操人视频| 9999免费精彩视频| 无码 有码 国产18p| 欧美中文字幕日韩在线| 中文字幕人妻资源在线| 亚洲天堂欧美| 亚洲日韩天堂| 97超级久久强资源| 欧美 亚洲 制服 精品| 欧美色图天堂在线| 久久99操天天日| 色色无码| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 97干在线| 欧美黄片欧美黄片xxx| 亚洲精品国产熟女| 日韩激情啪啪| 色婷婷电影网| yiren97| 日本丝袜美腿人妻九九| 中文字幕一区二区三区蜜桃视频| 97超碰影音| 亚洲丝袜综合| 日本操逼视频在线| 无码聚合| 一区二区偷拍拍视频| 亚洲色鬼| 国产精品久久久久久久久久久久久久久久| 少妇内射www在线观看视频| 欧美久久人妻少妇一区二区| 久久婷婷苹果| 久久久久久精| 国产亚洲精品无码三区| 色色色欧美| 九七超碰| 18禁中文字幕| 999久久久精品国产| 国产精品肉丝自拍| 亚洲文学偷乱拍啪啪啪啪| 97亚洲自在精品在线观看| 大香蕉草草| 男人的午夜天堂| 岛国1区2区3区在线观看| 上海一级黄片| 伊人亚洲国产一成人久久精品,久久| 91 丝袜在线| 亚洲综合草草| 天天看夜夜看日日干| 99久久久er直播网址| 激情五月综合| 亚洲日韩乱码中文无码蜜桃臀网站| 色哟哟av| 岛国在线免费视频| 青青草日韩无码| 少妇内射视频| AV乱伦专区| 天天操天天舔| 亚洲自拍一区夜夜操| 久久久久久久| 强奸乱伦日韩AV| 色穴精品| 少妇高潮九九九九九九九| 高清无码久操视频| 天天日天天爽| 久久线上视频免费看| 蜜乳视频网站| 极品五月天噜噜| 久久久久大香青草精品综合| www.av家庭乱伦| www.av在线观看| 人人操人人射人人干| 黑人娇小av在线播放| 色婷婷九月天天综合| 久久久久久久久久久久久久久乱码| 丰满丝袜少妇AV| 成人精品在线免费视频| 屌逼麻豆| 夜夜夜夜久久久久| 久久亚洲精品成人av| 亚州色阁| 欧美激情中文字幕另类小说| 自拍视频大全亚洲专媒视频/一区二区三区 | 久日91在线| 男人的天堂2019| 天天干天天拍| 日日躁夜夜躁狠狠躁超爽| 激情干在线| 99re6国产精品99re| av一区二区三区不卡| 先锋精品av色鲁| 国产精品伦理| 久久黄黄| 久久久新亚洲AV| 五月激情小说| 久夜视频| 国产白领连续中出在线观看| 国产色产精品在线观看| 美女人妻色网站| 国产精品九九九| 97香焦色区| 国产偷人伦激情在线观看| 久久国产99精品72福利 | 色99色| 天天舔日美女视频| Av色五月| 色黄污美女啪啪啪免费网站| 蜜乳av一区二区三区四区不卡| 大香焦A片| 中文字幕第23区| 日韩欧美tv一区二区在线观看| 欧美色图天堂网m| 成人性爱AV在线免费观看| 啊啊好多水| 亚洲色 国产 欧美 日韩| 中文字幕一区二区三四五区日日骚| 欧亚成人| 精品传媒在线一区| 风骚少妇视频中文字幕| 亚洲精品视频在线播放| 亚州一区二区| 男人网站婷婷| AAA久久| 啊啊啊啊啊啊在线观看| 精品一区二区三区四区外站 | 欧美人妻熟女在线| 狠狠躁AV| 欧美人妻精品一区二区| 激情六月婷婷| www.亚洲黄色| 综合自拍| 人妻丝袜肏逼| 熟妇最新先锋一二三区| hd成人一区二区在线| 久久99国产精品| av操操不卡| 日本一区二区不卡精品| 99国产精品| 欧美色综合图片| 中文字幕五区| 国产网站在线播放| 日韩性爱一级片| 欧美黑人91| 亚洲另类久操网| 久久婷婷综合国际产色怕| 综合久久2017| 青青草导航在线视频| 欧洲射精91| 99色天堂| 91动漫操逼视频| 婷婷干黄色| 91宗合网| 国产天天噜一噜久久久| 久久久18禁| 欧美亚洲日韩人妻在线观看| 亚洲超碰AV| se吧提供91精品国产91久久久久久 | 久草男人天堂| 精品九九九九九九九| 色婷婷丁香五月| 国产av又色又爽又黄| 欧美性爱一区二区| 97在线免费观看视频| 东北女人性交| 男人天堂导航| 亚洲人综合| 免费少妇一区二区| 麻豆天美91| 色原狠狠天天天| 久久宗合亚洲| 97超碰在线资源网站| 欧美午夜色妇色鬼| 国产免费大片| 国精品一区二区三| 欧美日韩国产中文精品字幕自在自线, | 加勒比久久综合网高清| 在线人人人人人人精品超| ,成人免费啪啪视频| yw尤物av无码点击进入麻豆| 日韩成人高清一区二区| 亚洲阿v天堂在线| 中文字幕国产在线天堂| jk白丝没脱就开始啪啪| 一级黄色视频网| 岛国黄| 日韩卡一卡二卡三在线| 91碰超| 在线无码操| 国产精选三级在线观看| 在线看免费无码AV天堂的| 人人色人人操在线| 日本色色网| 色色99| 天天综合亚在线| 超碰超碰95| 欧美三级免费伊人| 久久一二三四不卡 | 欧美日韩妖精91com| 久久一二三四五六七八九区| 我爱大香蕉| 5月婷婷6月六月丁香| 91超级碰| 天天影视色香色欲| 男生女生啊啊啊啊| Julia Annxxxxx| 激情婷婷丁香网| 美欧色综合| 欧美激情综合| 日本操嫩b网| 爱做久久久久久| 欧美夜夜狠| 91成人在线| 亚洲精品黑丝| 家庭乱伦麻豆| 亚洲黄色a级片| 日本人妻A片成人免费看片| 色久综合| 1024手机看片欧美日韩| 人人操人人肉久久精品| 国产特级毛片AAAAAA高潮流水| 91三级理论片播放器| 天天干天天做| 精品人妻一区二区三区夜夜| 超碰97男女| 国产多人在线观看视频| 丁香五月性爱| 18禁久极品美女久久哦哟呀!| 伊人性在线视频| 中文字幕久久婷婷丁香五月天| 巨爆乳一区二区爆乳区| 91大学精品激情戏| 国产视频大全| 精品午夜福利导航| 九九热最新| 欧美色日本| 野狼福利社区| 欧美图片色五月天| 日韩熟女无码| 婷婷五月天社区| 亚洲 另类 丝袜 自拍 动漫| 欲香欲色| 99综合视频一体| 伦理日韩国产久久| 成人av毛片在线观看| 国产精品一区二区黄片| 欧美日韩亚洲五月天婷婷| 国产精品久久久| www色婷婷| 男人精品天堂一区| 免费?级毛片无码?∨蜜芽试看| 婷婷激情五月综合| 久久久精品九| 国产日本久久免费精品| 久久精品国产久精国产| 第四色奇米影视777| 久久久一热在线播放| 老司机福利社视频在线观看| 99久久e免费热视| 成人丁香五月| 在线只有精品| 97视频在线观看播放与子乱对白在线……| 亚洲欧洲视频小说在线观看| 日韩一级欧美一级在线观看| 91人妻Pr| 四虎影视永久在线免费| 蜜臀久久99精品久久久久久-DVD| 婷婷五月激情综合| 亚洲啪啪综合?v一区综合精品区| 久久人妻丝袜一区二区三| 久久精品店| 一区二区三区四区久久视1| 婷婷久月| 激情露脸爱| 亚洲AV麻豆Aⅴ无码电影一| 国色天香av| 96久久久久| 婷婷香蕉欧美在线一区二区三区| 好爽免费视频| 精彩视频日韩| 一级片视频啪啪| 自拍盗摄一区| 欧美亚洲| 青青草大香蕉视频| 亚洲激情久久久伊人综合| 国产视频不卡在线观看| 99rre在线精品99re8| 97人人草| 中国农村熟妇毛片视频| 很很很很操| 亚洲无码一区二区三区三州| 男人的天堂99| 成人女人国产| 美中日韩无码| 福利视频网站| 嫩草影院永久在线制服丝袜| 欧美日韩国产色图在线| 亚洲高清自拍| 亚洲性猛交| 婷婷午夜| 国产精品高潮呻吟av久久4虎| 加勒比日本在线| 国产美女高潮叫床视频| 狠狠干91| 嫩草91| 丁香激情五月| 95自拍视频在线观看| 91精品操美女| 一区二区三区日韩欧美| 一级久久性爱视频| 超碰成人人人爽人人爽| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | **一级毛片国产| 国产精品久久久久久久久久久久| 欧美亚洲美少妇一区二区| 少妇精品久久久八区九区| 激情五月丁香五月| 精品成人亚洲午夜电影| 校园春色五月天| 欧美一区二区三区黄色影视| 私色综合网| 亚洲情色中文字幕一区| 粉嫩av平台| 欧美爱国产综合、| 97色97好| 女色视频社区| 欧美视频在线视频免费va| 91伊人久| 亚洲人妻在线精品| 大香久久| 青青草导航在线视频| 熟妇艹鸡八| 一二三四免费视频| 大香蕉丝袜一级片| 1769精品一区二区三区| 乱伦1色页| 欧美成人A√在线一区二区| 亚洲中文字幕一区二区| 欧美后入式| 干B| 国产大片精久久久久久| 精精夜夜| 久久久久久久久久久六六| 久久精视频美日韩在线视频| 国产av波波国产精品| 91免费看一区二区三区| 东京热大香蕉| 外国91| 国产精品乱码久久| 欧美日韩久久精品爱爱| 9美女超碰在线免费观看| 丝袜狂射91| 亚洲色悠悠久久88| 成人片视频| 日欧毛片久久| 亚洲 欧美 综合 91| 黄色不卡视频| 久偷拍欧美日韩三区| 欧美黄色大片在线观看 | www.色婷婷.com| 精品久久人妻成人网| 无码黑人精品一区二区三区三| 国产强奸乱伦xd| 成人一级性爱| japan日本高清乱xxxx| 国产一级不卡在线观看| 国产超碰人人爽人人做| 青青草丝袜在线视频| 婷婷丁香成人| 天天添天天干电影| 欧美性战999| 青青操在线亚洲视频观看欧美在线 | 乱伦AVxx| 婷婷五月成人| 亚洲美女精品| 欧美色图 人妻| 偷拍五区| 久久人妻熟女一区二区| 亚洲色图欧美一区二区不卡| 久久久久久亚洲Av无码精| 免费少妇一区二区| 欧美亚洲日本激情在线| 婷婷尹人大香蕉免费| 精品久久99| 亚洲视频二区 | 欧美成人四级在线播放| 中文字幕精品区先锋资源| 婷婷丁香五月综合| 青草香蕉网| 日日骚av| 操操操五月天婷婷丁香影院| 美女一区二区国产精品| 久久久蜜桃一区二区三区| 欧美少妇第一页| 果冻传媒一区二区三区| 久久久亚洲熟妇熟女| 国产欧美成人第一页在线观看| 免费看一级a性色生活片久久无| 乱人伦 国语对白:视频直接看| 国产高清不卡视频| 久久曰曰| 九九热超碰97亚洲最新香蕉| 日本熟妇自慰性高潮一区二区三区| 夜夜爽夜夜爽| 久久肏大逼| 最新亚洲风情电影| 粉嫩av一区二区三区天美传媒| 国产精品久久久久久久无码AV| 91成人精品在线播放| 欧美在线官网| 99久久免费看精品国产一区| 大香蕉一区二区在线观看.| 丁香五月成人| 女上位精品在线| 丰满美女一级毛片在线播放| 亚洲黑丝在线| 国产久9| 日韩欧美成人综合在线| 国产视频三区四区| 97日韩超碰超碰中文字幕| 淫荡少妇免费| 91亚州欧美| 啪啪综合网| 五月婷婷激情网| 亚洲精品黑丝| 国产AV毛片| 大吊色| 欧美黄色手机在线观看| 人妻啊啊人妻啊啊| 久热这里只有精品9| 黄片aaaaa一区| 亚洲精品蜜桃久久久久久久| 日本高清免费一本视频在线观看| 国产一区二区三区中文字幕| 人妻精品一区二区| 久久五月婷| 另类图片五月天| 操高情无码| h色99999| 久久精品中文字幕观看| 91丝袜激情在线| 天堂69亚洲精品中文字| 日产国产精品中文久久婷婷| 超碰97亚洲| 欧美|91色综合| 少妇久久久久| 久久国色天香香蕉| 天天看精品动漫视频一区| 又黑又大又粗| 成人小说另类在线| 97 国产一区| 国产美女裸体秘 永久无遮挡| 激情文学 国产一二三aV| 欧美成人性爱视频在线播放 | 91大胆欧美| 久久超碰网| 97操97色| 操逼视频色| 天美传媒Av在线| 国产操操日韩三级黄| jiujiujiujingpin| 午夜久久无码1000合集| 99精品无码| 熟妇熟女视频一区二区三区| 欧美精品三级黄片| 加勒比综合九九99视频在线播放| 99国产精品视频尤物| 欧美日韩国产人人| 国产欧美一区激情交| 天堂综合网| 日韩欧亚太美不卡| 91精品女厕偷拍视频| A一级色女| 婷婷激情五月综合| 在线观看一级α片刺激高潮视频| 久久爱超碰网| 九九香蕉网| 五月丁香黄色网| 男人精品天堂一区| 蜜桃久久一区二区三区| 久久久精品91八戒| 男人的天堂三级| 久操B网| 久久久久久久国产视频| 偷拍视频青青草在线视频| 亚洲影院小综合| 亚洲精品日韩国产欧美| 日韩电影在线观看网址| Aa东京男人的天堂| 情色日播放AV| 日韩精品黄片免费观看| 激情小说亚洲| 亚洲好色人妻| 60秒试看最爽10分钟网站| 牛黄色久午久| 国产精品露脸在线观看| 少妇高潮一区二区三区在线| 操逼内射干逼白丝91| 日本99久久| 影音先锋视频在线| 超碰在线一区| 色天使AV天堂| 欧美综合在线91| 丁香六月婷| 极品尤物自安慰| 亚洲国产成人精品久久久国产成人一区二区 | 久久有码视频| 亚洲drav色图| 久久久穴999| 嗯啊不要啊在线 | 国产天天看| 九九热视频在线观看| 欧美日韩香蕉| 欧美黄色大片在线观看 | 亚洲高清无码在线桃色| 99久久亚洲精品无码毛片潘甜甜| 免费视频观看60秒| 一级性爱aaaa| 亚洲图片婷婷五月天| 97九色| 色综合91好| 久久久涩| 后入综合久久| 俺也射| 97热视频在线观看| 日本黄色裸日本黄色裸体 | 97亚洲精品超碰| 亚洲中文sv| 另类老少妇| 97欧美久久久久久久| 2026国产精品视频| 美女黄码视频午夜| 男人网站婷婷| 狠色婷婷久久一区二区三区_| 日日干夜夜操视频h| 熟女啪啪视频| 97精品国产97久久久久久免费| 中文字幕 码 自拍 视频 区| 丁香五月婷婷啪啪| 另类小说五月天| 操碰97| 亚洲日产专区| 91人人看| 欧美五区| 好屌色综合| 精吧天堂| 国产97综合| 十八禁黄色| 久久一区二区蜜桃| 蜜臀久久99精品久久久久| 亚洲图片另类| 欧美性爱综合,免费| 91东京热男人的天堂| a片偷拍视频| 一级特黄aaa大片在线观看成人一级片在线观看 | 一级黄色视频网| 国产 热久久久久国产精品| 日本国产高清色www视频在线| 在线强奷到舒服的无码视频 | 曰韩香蕉97| 国产麻豆91欧美一区二区久久婷婷国产精品| 在线观看啊啊啊啊啊| 青青草在线视频播放器| 999精品久久久久久久| aaa亚无码专区| 国产欧美精选激情视频| 国产成人无码网站在线视频| 亚洲学生妹高清av| 欧美日韩黄片精品在线| 久久久久久久国产a∨| 日韩九区| 嫩草 人人网精品| 丰满人妻一区二区中文| 偷偷人人精品女女久久| 狠狠操,使劲操| 十八禁的黄污污免费网站| 九九色精品| 久久久婷婷| 久啪视频| 国产三级在线现体验区| 亚洲偷拍自拍在线视频| Av色五月| 欧美高清在线| 美女裸体无遮挡永久免费观看网站| 精品人妻中文字幕4399| 99热这里只有精| 青春草A| 9Ⅰ超碰| 亚洲 日本 国产 综合| 香蕉综合网| 黑人精品久久97| 射综合网| 久久久久久AV无码免费网站| 97超碰色屌| 中国少妇啪啪视频| 国产探花精品在线| 国产性感骚丝袜在线| 老鸭窝在线视频播放| 啪啪啪东京| 看日韩美女二区三区免费操逼视频 | 中文字幕激情小说| 黄骗免费| 日欧美色| 78久久| 激情视频网址| 伊人久久亚洲色欲综合网站 | 成人五月天色网| 久久精品熟妇丰满人妻99| 美女国产一区二区久久| 国产午夜视频| 天堂v无码免费视频| 综合久| 亚洲精品黑丝| 国产精品视频麻豆入口| 四季AV综合网址| 综合夜夜| 亚 欧 美 综合| 这里只有97精品| 人人看人人摸人人色| 青青草久草AV| 看大黄色大片原件| 久久久久久久久久久久黄色| 亚洲精品一区二区日本| 中文字幕一区av| 殴美色网| www.婷婷| 久久综合九九| 欧美后入式| 国内自拍 日韩激情 99| 蜜臀在线看片| 亚洲色图亚洲无码强奸乱伦| 熟妇激情| 日韩乱伦视频| 婷婷九月丁香| 亚洲中文字幕三级在线| 激情视频图片| 午夜丁香| 美女啊啊啊啊啊| 亚洲色图久久精品蜜| 97视频在线播放| 欧美专利1区2区3区4区5区免费| 91天天综合日韩欧美| 亚洲精品一区中文字幕乱码| 精品久久久久久久| 青青爽| 国产福利电影| 少妇内射www在线观看视频| 黄色AAAAA欧美| 亚洲丝袜99| 欧美黄色片AAAAA| 久久精品国产亚洲av水密被窝| 91黑丝露脚| 久操91视频| 欧美视频激情久久久久久| 嗯啊抽插大香蕉网页| 青青草中出视频| 久久人妻视频网| 国产91亚洲精品一区二区三区| 日本一片一区| 熟女人妇一区二区三区| 免费视频观看60秒| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 免费男人的天堂| 亚洲综合色网| 三级日本一区二区三区| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 亚洲性感丝袜诱惑在线观看| 久久艹逼视频| 国产一国产一级毛片古装| 99精品网站| 精品国产www久久| 中欧人妻丝袜中文字幕| 青青草日本中文字幕| 一区三区啪啪| 九九碰九九爱97超| 日韩精品国产一区二区| 久久99久久99精品天美传媒棢·纸:. | 天天日天天插| 日本十八禁免费看污网站| 熟妇一区,二区,三区。| 在线观看十八禁| av网页一区二区三区| 伊香蕉综合久久久久久久噜噜噜 | 26uuu国产亚洲综合| 精品久久久久成人码免| 干B视频伊人网| 国产一级作爱毛片| 色综合av综合久久| 玖玖大干人妻| 91高跟美女在线播放| 久99热| 日韩人妻制服丝袜av| 精品午夜福利| 欧美女同在线| 国产乱弄免费在线视频。| www五月| 国产欧美岛国精品一区| 亚洲美女av无码| 97在线播放 | 亚洲精品a人片在线观看视| 女性喷水高潮在线观看| 精品人妻久久久久一区二区三区| 久艹伊人精品综合在线| 大香交伊人网| 五月综合婷婷久久网站| 操婢日韩| 在线午夜成人无码视频| 欲色综合| 超碰在线综合97| 国产地址二三| 草久久久| 日韩AV色图| 一本一道人妻久久一区二区三区 | 麻豆精品.欧美精品.日韩精品.| 98福利在线视频| 日韩欧美被操黄免费观看| 97超级久久强资源| 天天干,天天日| 四色永久成人网站| 操逼网站视频漫画国产| 乱伦a片视频| 亚洲高清无毛一区二区| 精品人妻一区二区三区在| 欧美亚洲系列| 久久大香蕉97| 久久青娱乐| 超碰97人人乐| 蜜桃AV天堂| 黄站在线免费观看| 大香交| 日韩成人人妻网站| 大香蕉一人| 九九五月天| 欧美综合综合| 欧美亚洲系列| 91黄站| 日韩15p| 亚洲色宗合| 熟妇乱伦一区二区| 日本黄大片在线观看视频| 香港澳门日本三级网站| 五月天婷婷在线看 | 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 欧美日韩操逼嗦吊| 欧美日韩性爱精品| 狠狠干婷婷| 人妻少妇蜜桃视频欧美一区| 婷婷日韩一区二区三区中文字幕在线| 九九内射在线| 国产又黄又猛又粗又爽的网站| 97日本超碰综合| 久久色一区| 久插综合| 国产99999久久精品| 在线播放中文字幕| 78操B| 91福利网在线观看| 超碰在线观看av不卡| AA特级绝黄| 婷婷97| 97一区二区蜜臀| 国产精品久久久九九九| 骚熟女AV网| 亚洲啪啪综合?v一区综合精品区| 蜜臀AV秘一区翔田千里| jizzjizz欧美| 91无码中出人妻视频| 成人日韩中文字幕| 天天干1区2区在线| 国产精品扒开腿做爽爽爽视频| 亚洲乱码精品一区二区| xxx0国产在线播放| 99精品无码| 2019天天操天天爽天天拍| 91视频综合在线| 五月天亚洲色图| 欧美黄片免费在线观看视频| 激情综合网五月婷婷| 后入人妻一区| 日本精品一区二区三| 天美传媒AV在线播放| 久久精品日韩| 激情文学网伊人| 人妻内射一区二区在线视频| 亚洲欧美91| 国产精品点击进入在线影院| 亚洲激情AV| 久草综合视频| 亚洲色宗合| 国产精品自在自拍视频| 日韩欧美麻豆大片| 精品制服美女中文一区二区三区| 国产精品电影大全| 欧美日韩国内不卡| 日韩99神马视频播放| 东北女人性交| 国产精品无码av| 99中出在线| 999国产精品999久久久久久| 激情抓乳插进去啪啪啪日韩 | 97国产综合欧美| 成年人网站在线免费观看| 五月丁香激情综合| 大香蕉之青青草原| 玖玖爱在线视频免费观看| 婷婷久久五月| 日韩久草| 日韩中文字幕精品一区在线| 97干日韩| 亚洲 欧美 第一页| 亚洲综合精品国产一区| 91网站18在线| 免费精品国偷自产在线在线| 中文字幕永久在线| 大干人妻| 综合影视国产无码| 国产av热热色| 无码人妻一区二区三区色欲aⅴ | 国产精品第一页国产大屁股视频免费区| 亚洲天堂人妻熟妇视频| 91精品丝袜久久久久久无码人妻| 色欧洲| 日本色婷婷| 日韩天天综合| 国产伦乱91| 激情情色五月天| 午夜福利免费精品视频| 国产欧美黑人丰满在线| 人妻丰满熟妇一区二区三| 一区久久久二区| 男女无套 免费网站| 国产玖玖| 韩国三级色呦呦| 欧美制服另类丝袜| 一区二区不卡视| 97超级久久强资源| 亚洲在线| 国产夜夜艹| 情趣丝袜无码操逼视频| 99天天超碰| 日韩无码操逼片| 日韩电影天堂视频一区二区| 成人乱人伦一区二区| 日韩ab网| 人人操人人搞人人草| 97网址97| 国产女性无套 免费观看| 久久久久九九九九九| 久久久国产成人一区二区三区在线| 2020中文字幕在线| 日本精品第一视频在'| 91国产丝袜白虎| 日本三级黄页| 熟妇综合一区二区三区| 日逼五月天| 日韩欧美aⅴ综合网站发布| 超碰久久综合| 色色激情五月天| 精品人妻一区二区三区日产乱码| 97超碰无码网| 性色av蜜臀av色欲aV| 老鸭窝日丰县女人| 大香蕉AV在线| 男女性无套 免费九一| 人妻 制服 日韩 中文 在线| 日本激情免费大片| 天天欧美| 5252色欧美在线| 免费作爱一级视频| 亚洲天天更新| 鸥美插入视频| 激情四射五月天| av天堂手机版追回| 自拍偷拍草一草| 日本操逼视频不卡直接放| 天美精品av| 亚洲男人电影天堂| 亚洲永久永久永久永久一级一级一级精品 | 久久精品一区| 国产女乱淫真高清免费视频| 夜夜春夜夜操| 日日天天久久啊啊aaa| 操操逼操操逼操操逼逼| 久久粉色| AV在线资源| 五月丁香啪啪| 乱伦a片视频| 女优大全 - 91n| 丝袜av一区二区三区| 开心五月深爱五月| 岛国毛片在线观看免费| 久久有码视频| 国产美女口爆吞精| 亚洲高潮少妇| av日韩国产一区二区| 日日操丁香五月天| 淫荡网址| 后入式999| 99999精品成人| 久9视频| 一级片在线观看高清无码| 偷拍盗拍亚洲色图图片| 亚洲色图 图片| 熟女在线视频| 成人短视频在线观看| 天天做日日做| 欧美裸体美女日麻屄| 本道在线| 日日黄色三级网站| 91久久久久久久久久久| 精品一区二区成人动漫| 亚洲精品国产熟女| 久久天堂| 91亚洲情色| 老熟妇一区二区三区| 久久中日麻豆| 久久久噜噜噜久久久| 久久精品99| 性爱乱伦一区| 日本三级网页| 美国人人操人人操| 午夜a成v人电影| 综合久久少妇中文字幕| 久久精品国产亚洲av水密被窝| 欧洲亚洲人人爽爽视频| 亚洲吊色| 国产黄色动态精品| 日本免费一区二| 人妻天堂综合网| 国产超碰在线| 欧美在线视频99| 色婷婷亚洲婷婷| 岛国片在线观看视频亚洲| 日本欧美一区二区三区免费| 女同女同恋久久级三级| 免费观看网黄| 欧美精品久久久久久久丰满| 97干色| 性综合网| 日韩欧美加勒比| 极品白嫩美少妇在地板上位骑射淫水泛滥| 久久老熟女| 亚洲AV色图| 久久久久久久性爱| 伦理第一页| 亚洲97在线观看| 91色综合| 大香蕉免费3| 岛国片在线播放| 东北丰满熟女国产一区| 日本狂喷奶水在线播放212| 国产东北女人在线视频| 成人a大片在线观看| 91成人久久| 天天看,天天做| 婷婷五月成人| 97人肏| 99热导航| 综合一区二区影视| 中日992视频| 先锋女优在线观看视频|