1. 程式人生 > >如何理解“面向介面的程式設計”

如何理解“面向介面的程式設計”

經常聽說“面向介面程式設計”,但並不是特別的理解。什麼時候應該面向介面程式設計?

當我一開始接觸暴露出的介面的時候,我很困惑,並不知道為什麼需要他們。如果我們使用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中可能是一群蒼蠅或者一群推銷員,他們在打擾別人的時候可以分開幹自己的活。