面向接口编程就是将对象中的某个功能提取出来作为接口,而功能的具体实现则交由继承自这个接口的实现类处理。
面向接口的好处是降低程序的耦合性,当有新的功能时只需要对新功能进行编写,不需要修改已有的代码
下面是一个简单的范例:
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 飞行速度非常快