面向接口編程就是將對象中的某個功能提取出來作為接口,而功能的具體實現則交由繼承自這個接口的實現類處理。
面向接口的好處是降低程序的耦合性,當有新的功能時只需要對新功能進行編寫,不需要修改已有的代碼
下面是一個簡單的范例:
1 //父類 2 public class Duck 3 { 4 protected IFlyBehaviour flyBehaviour; 5 //可以動態修改對象的某一功能的實現 6 public void SetDuckFly(IFlyBehaviour fb) 7 { 8 flyBehaviour = fb; 9 } 10 public void DuckFly() 11 { 12 flyBehaviour.Fly(); 13 } 14 } 15 16 //小鴨子類,繼承鴨子類 17 public class LittleDuck : Duck 18 { 19 public LittleDuck() 20 { 21 flyBehaviour = new SlowFly(); 22 } 23 } 24 25 //大鴨子類,繼承鴨子類 26 public class BigDuck : Duck 27 { 28 public BigDuck() 29 { 30 flyBehaviour = new QuickFly(); 31 } 32 } 33 34 //飛行為的接口,只定義了飛行的方法而未實現 35 public interface IFlyBehaviour 36 { 37 void Fly(); 38 } 39 40 //實現快速飛的行為類,繼承了飛行接口 41 public class QuickFly : IFlyBehaviour 42 { 43 public void Fly() 44 { 45 Console.WriteLine("飛行速度非常快"); 46 } 47 } 48 49 //實現慢速飛行的行為類,繼承了飛行接口 50 public class SlowFly : IFlyBehaviour 51 { 52 public void Fly() 53 { 54 Console.WriteLine("飛行速度非常慢"); 55 } 56 }
假設作為父類的鴨子類Duck具有飛行的功能,繼承自它的兩個子類大鴨子BigDuck飛得快,小鴨子LittleDuck飛的慢,通過面向接口的方式進行實現,而通過父類Duck中的SetDuckFly()方法,我們還可以在程序運行過程中動態的去修改某一功能
執行:
1 BigDuck bigDuck = new BigDuck(); 2 bigDuck.DuckFly(); 3 4 LittleDuck littleDuck = new LittleDuck(); 5 littleDuck.DuckFly(); 6 7 littleDuck.SetDuckFly(new QuickFly()); 8 littleDuck.DuckFly();
結果:
1 飛行速度非常快 2 飛行速度非常慢 3 飛行速度非常快
