设计引导--一个鸭子游戏引发的设计理念(多态,继(3)


先做个飞行行为的接口:
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如何叫就行了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1624.html