今天有個同事問我,如何理解接口,恰好中午下班要去吃飯,邊走邊說,可是都沒有說到重點,因此想經過這篇文章來分享一下本身對接口的理解,閱讀須要2分鐘。html
對象經過它們公開的方法來定義它們與外界的交互行爲,而方法就造成了與外界交互的接口。例如電視機的開關按鈕就是你與塑料外殼另外一側的電線之間的接口,你只要按下電源開關這個按鈕,就能夠控制電視機開機和關機,而你不須要關注電視機開機和關機的細節,接口就是讓你知道它在作什麼,而無需知道它們怎麼作;接口更深層的理解是:使定義(規範和約束)和實現(具體的代碼邏輯)分離,它是溝通(交互)的中介物(具體實現)的抽象化。java
public inteface TV {
// 開機
public void open();
// 關機
public void close();
// 選擇頻道
public void selectChannel(Integer channel);
// 設置聲音大小
public void setVolume(Integer vlume);
...
}
複製代碼
上面聲明瞭電視機的接口(編程語言層面的接口),暴露4個方法(與外界交互的接口),經過閱讀這些方法,你腦海裏大體能夠對這個電視機建模,而且知道這個電視機能夠作些什麼,這樣你們就都達成了一個共識,電視機都會具備哪些功能了;而具體要怎麼實現電視機的那些功能(開機、關機、選頻道、設置聲音大小)呢?這就交給不一樣的電視機廠商吧。算法
// 小米電視
public inteface MiTV extends TV {
// 擴展玩遊戲接口
public void playGame(String gameId);
}
public class MiTVImpl implements MiTV {
@Overide
pubilc void open() {
// TODO 小米對開機的實現
}
@Overide
public void close() {
// TODO 小米對關機的實現
}
@Overide
public void selectChannel(Integer channel) {
// TODO 小米對選擇頻道的實現
}
@Overide
public void setVolume() {
// TODO 小米對聲音大小控制的實現
}
// 擴展玩遊戲接口
@Overide
public void playGame(String gameId) {
// TODO 對遊戲的實現
}
}
複製代碼
從上面的代碼中能夠知道,小米電視機不只實現了電視機的基本操做,自身還擴展了玩遊戲的接口,用戶只須要經過選擇小米電視提供的遊戲,就能夠玩遊戲啦。編程
// 吹口哨
public inteface Whistler {
/** * 吹口哨 */
public void whistle();
}
public class JuniorWhistler implements Whistler {
public void whistle() {
System.out.println("入門級口哨聲");
}
}
public class SeniorWhistler implements Whistler {
public void whistle() {
System.out.println("高級口哨聲");
}
}
// 定義動物接口
public inteface Animal {
/** * 吹口哨 * * @param whistle * @return */
public void whistle(Whistler whistle);
}
public class Human implements Animal {
public void whistle(Whistler whistle) {
whistle.whistle();
}
...
}
public class Parrot implements Animal {
public void whistle(Whistler whistle) {
whistle.whistle();
}
...
}
public class Demo {
public static void main(String[] args) {
// 人吹口哨
Human human = new Human();
human.whistle(new JuniorWhistler()); // 入門級口哨聲
// 鸚鵡口哨
Human human = new Human();
human.whistle(new SeniorWhistler()); // 高級口哨聲
}
}
複製代碼
public inteface Whistler {
public void whistle();
}
public class Human implements Animal {
public void whistle(Whistler whistle) {
whistle.whistle();
}
...
}
複製代碼
Human
類中的 whistle()
方法的實現 whistle.whistle()
不須要知道口哨具體的實現類是哪一個,而 whistle(Whistler whistle)
方法 只關注入參是 Whistler 類型就行。 至於 Java 如何實現動態綁定到具體的實現類上的方法,這個以後另開一篇文章來寫。oracle
這雖然很難去定義(即便不少人一直使用面向接口編程),但我的仍是根據自身的開發經驗淺談一下,若是說的不對,歡迎你們指教。框架
推薦的一些在線API管理平臺 Swagger Editor、eolinker編程語言
本文經過一些例子和我的的開發經驗,從接口的定義、接口的聲明、再到接口的適用場景,來與讀者分享本人對接口的理解,但願能夠給讀者一些收穫,若是發現本人有理解不對的地方,或者有須要補充的地方,歡迎評論交流。ide