先做个飞行行为的接口:
public interface FlyBehavior
{
void Fly();
}
呷呷叫行为的接口:
public interface QuackBehavior
{
void quack();
}
是否听说过这么一个设计理念:
针对接口编程,而不是针对实现编程。
而“针对接口编程”真正的意思是“针对抽象类编程”。
“针对接口编程”的关键就在多态。利用多态,程序可以在针对抽象类编程,执行时会根据实际状况执行到真正的行为,不会被绑死在抽象类的行为上。
再深挖一点,“针对抽象类编程”这句话,可以更明确地说成“变量的声明类型,应该是抽象类型,这可以是一个抽象类,或是一个接口”!不理解没关系!接下来我们用程序来让大家慢慢吃透这个概念!
举个传统的例子:
针对实现编程:
Dog d = new Dog();
d.bark();//“汪汪”叫行为
针对接口或抽象类编程:
Animal animal = new Dog();
animal.makeSound();//这个方法实现“汪汪”叫
这个不明白?没关系,有图:

现在让我们来重新实现鸭子游戏中的设计吧!
先设计飞行行为:
复制代码 代码如下:
class FlyWithWings:FlyBehavior
{
public void Fly()
{
Console.WriteLine("我会飞啦~!");
}
}
class FlyNoWay : FlyBehavior
{
public void Fly() {
//什么都不做,它不会飞
}
}
我把两个类放在一起了,这方便大家阅读,实际上应该分开的。
再看看“呷呷”叫行为:
复制代码 代码如下:
class Quack : QuackBehavior
{
public void quack()
{
Console.WriteLine("呷呷!");
}
}
class Squeak : QuackBehavior
{
public void quack() {
Console.WriteLine("吱吱!");//橡皮鸭
}
}
class MuteQuack:QuackBehavior
{
public void quack()
{
Console.WriteLine(".......");//"诱饵鸭"不会叫
}
}
行为做好了~来实现Duck类
复制代码 代码如下:
public abstract class Duck
{
public FlyBehavior flybehavior;
public QuackBehavior quackbehavior;
public void performQuack() {
quackbehavior.quack();
}
public void performFly()
{
flybehavior.Fly();
}
public virtual void Swim(){
Console.WriteLine("~~游~~");
}
public virtual void Display(){}
}
结构很简单,不是吗?定义QuackBehavior,FlyBehavior,每只鸭子都会引用实现QuackBehavior接口对象,让它们来处理鸭子的行为。
想要呷呷叫的效果,就要quackbehavior对象去呷呷叫就可以了,我们现在不用再关心quackbehavior接口的对象是什么,只要关系Duck如何叫就行了。