面向接口编程的优点_为什么我们要面向接口编程
到底面向?編程
面向過程編程( ProcedureOriented、簡稱 PO) 和 面向對象編程( ObjectOriented、簡稱 OO) 我們一定聽過,然而實際企業級開發里受用更多的一種編程思想那就是:面向接口編程( Interface-Oriented)!
接口這個概念我們一定不陌生,實際生活中最常見的例子就是:插座!
我們只需要事先定義好插座的接口標準,各大插座廠商只要按這個接口標準生產,管你什么牌子、內部什么電路結構,這些均和用戶無關,用戶拿來就可以用;而且即使插座壞了,只要換一個符合接口標準的新插座,一切照樣工作!
同理,實際代碼設計也是這樣!
我們在設計一個軟件的代碼架構時,我們都希望事先約定好各個功能的接口(即:約定好接口簽名和方法),實際開發時我們只需要實現這個接口就能完成具體的功能!后續即使項目變化、功能升級,程序員只需要按照接口約定重新實現一下,就可以達到系統升級和擴展的目的!
正好,Java中天生就有 interface這個語法,這簡直是為面向接口編程而生的!
所以接下來落實到代碼上,舉個通俗一點的小例子嘮一嘮,實際業務代碼雖然比這個復雜,但原理是一模一樣的。
做夢了
假如哪一天程序羊真發達了,一口豪氣買了兩輛豪車,一輛五菱宏光、一輛飛度、并且還專門聘請了一位駕駛員來幫助駕駛。
兩輛豪車在此:
駕駛員定義在此:
駕駛員定義了兩個 drive()方法,分別用來駕駛兩輛車:
這暫且看起來沒問題!日子過得很融洽。
但后來過了段時間,程序羊又變得發達了一點,這次他又豪氣地買了一輛新款奧拓(Alto)!
可是現有的駕駛員類 Driver的兩個 drive()方法里都開不了這輛新買的奧拓該怎么辦呢?
代碼的靈活解耦
這時候,我想應該沒有誰會專門再去往 Driver類中添加一個新的 drive()方法來達到目的吧?畢竟誰也不知道以后他還會不會買新車!
這時候如果我希望我聘請的這位駕駛員對于所有車型都能駕馭,該怎么辦呢?
很容易想到,我們應該做一層抽象。畢竟不管是奧拓還是奧迪,它們都是汽車,因此我們定義一個父類叫做汽車類 Car,里面只聲明一個通用的 drive()方法,具體怎么開先不用管:
這時,只要我新買的奧拓符合 Car定義的駕駛標準即可被我的駕駛員駕駛,所以只需要新的奧拓來繼承一下 Car類即可:
同理,只需要我的駕駛員具備通用汽車 Car的駕駛能力,那駕駛所有的汽車都不是問題,因此 Drvier類的 drive()方法只要傳入的參數是父類,那就具備了通用性:
問題暫且解決了!
但是再后來,程序羊他好像又更發達了一些,連車都不想坐了,想買一頭驢(Donkey)讓司機騎著帶他出行!
很明顯,原先適用于汽車的 drive()方法肯定是不適合騎驢的!但我們希望聘請的這位駕駛員既會開汽車,又會騎驢怎么辦呢?
害!我們干脆直接定義一個叫做交通工具( TrafficTools)的通用接口吧!里面包含一個通用的交通工具使用方法,管你是駕駛汽車,還是騎驢騎馬,具體技能怎么實現先不管:
有了這個接口約定,接下來就好辦了。我們讓所有的 Car、或者驢、馬等,都來實現這個接口:
這個時候只要我們的駕駛員師傅也面向接口編程,就沒有任何問題:
很明顯,代碼完全解耦了!這就是接口帶來的便利。
代碼的擴展性
面向接口編程的優點遠不止上面這種代碼解耦的場景,在實際企業開發里,利用接口思想對已有代碼進行靈活擴展也特別常見。
再舉一個例子:假設程序羊有一個非常豪氣的朋友,叫:程序牛,他們家出行可不坐車,全靠私人飛機出行:
但是突然有一天,他們家聘請的機長跳槽了,這時候程序牛一家就無法出行了,畢竟飛機不會駕駛。
于是他跑來問我借司機,想讓我的駕駛員來幫他駕駛飛機出去旅行。
我一看,由于他們的代碼面向的是接口,我就肯定地答應了他!
這時候對我這邊的擴展來說就非常容易了,我只需要安排我的駕駛員去培訓一下飛行技能就OK了(實現一個方法就行):
這時候我的駕駛員 Driver類就可以直接服務于他們一家的出行了:
看到沒,這一改造過程中,我們只增加了代碼,卻并沒有修改任何已有代碼,就完成了代碼擴展的任務,非常符合開閉原則!
實際項目
實際開發中,我們就暫且不說諸如 Spring這種框架內部會大量使用接口,并對外提供使用,就連我們自己平時寫業務代碼,我們也習慣于在 Service層使用接口來進行一層隔離:
這種接口定義和具體實現邏輯的分開,非常有利于后續擴展和維護!
小結
面向接口編程開發,對代碼架構的解耦和擴展確實很有好處,這種編碼思想也值得平時開發結合實踐反復理解和回味!
每天進步一點點,Peace!
2020.03.04 晚
總結
以上是生活随笔為你收集整理的面向接口编程的优点_为什么我们要面向接口编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3.5安装scrapy_Py
- 下一篇: pyCharm第三方插件下载---pyg