如何理解“面向介面的程式設計”
阿新 • • 發佈:2019-01-30
經常聽說“面向介面程式設計”,但並不是特別的理解。什麼時候應該面向介面程式設計?
當我一開始接觸暴露出的介面的時候,我很困惑,並不知道為什麼需要他們。如果我們使用Java或者c#,我們已經有了繼承這個概念,我一開始把介面視為一個弱繼承。但有個疑問“為什麼要這麼麻煩”?從某個方便講,把介面視為弱繼承是對的,但除此以外,我最終把介面的使用理解為:一種語言架構:把共同的特性和行為給物件化,抽象化,這樣就可以把一些看似不相關的潛在的物件展示出來。
舉個例子:
有一個SIM遊戲,和以下類:
class HouseFly inherits Insect {
void FlyAroundYourHead();
void LandOnThings();
}
class Telemarketer inherits Person {
void CallDuringDinner();
void ContinueTalkingWhenYouSayNo();
}
很顯然,這兩個類沒有共同處(從他們直接繼承的類來看),但你可以說他們都很煩人。
現在我們想想,我們的遊戲需要一些隨機的事情可以打擾玩家,在她們正在吃飯的時候。想像一下,一個蒼蠅或者一個電話推銷員多煩人啊。思考:蒼蠅和電話推銷員怎麼可以通過同一個函式呼叫,讓他們擾亂玩家?
你打算如果讓兩個完全不同的類,讓他們通過同一個方式去擾亂玩家?
key就是:讓他們都去實現同一個方法。
interface IPest {
void BeAnnoying();
}
class HouseFly inherits Insect implements IPest {
void FlyAroundYourHead();
void LandOnThings();
void BeAnnoying() {
FlyAroundYourHead();
LandOnThings();
}
}
class Telemarketer inherits Person implements IPest {
void CallDuringDinner();
void ContinueTalkingWhenYouSayNo();
void BeAnnoying() {
CallDuringDinner();
ContinueTalkingWhenYouSayNo();
}
}
可以把介面看成一個合同,現在兩個類可以通過自己的方式去擾亂玩家,實現瞭解耦,只需要滿足IPest 這個合同即可。
我們現在模擬這個場景:
class DiningRoom {
DiningRoom(Person[] diningPeople, IPest[] pests) { ... }
void ServeDinner() {
when diningPeople are eating,
foreach pest in pests
pest.BeAnnoying();
}
}
大家準備吃飯的時候呼叫ServeDinner,IPest[] pests中可能是一群蒼蠅或者一群推銷員,他們在打擾別人的時候可以分開幹自己的活。