这个quackbehavior接口可以重用了哦。有没有发现?在什么地方可以重用呢?思考下,我后面再提。
好了,现在来具体实现鸭子实体了:
复制代码 代码如下:
public class MallarDuck : Duck
{
public MallarDuck() {
quackbehavior = new Quack();
flybehavior = new FlyWithWings();
}
public override void Display()
{
Console.WriteLine("我是一只美丽的绿头鸭!");
}
}
o(∩_∩)o大功就要告成了, 看Program:
复制代码 代码如下:
static void Main(string[] args)
{
MallarDuck mallard = new MallarDuck();
mallard.Display();
mallard.Swim();
mallard.performQuack();
mallard.performFly();
}
一目了然,这个程序要做什么,怎么做,很简单吧?
看看运行结果:

代码也贴完了,程序确实可以运行,现在看下这个设计的最后一个概念:
多用组合,少用继承。
正如你看见的,使用组合建立系统具有很大的弹性,不仅仅将算法族封装成类,更可以在“运行时动态地改变行为”。
不知道什么是“运行时动态地改变行为”?
好,那我再演示一个,就拿那美丽的绿头鸭做例子:
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(){}
public void SetFlyBehavior(FlyBehavior flyb)//额外添加
{
flybehavior = flyb;
}
}
然后我再添加一个火箭动力:
复制代码 代码如下:
class FlyRockePowered : FlyBehavior
{
public void Fly()
{
Console.WriteLine("打了鸡血!4200米/秒,加速飞行!");
}
}
看看Program:
复制代码 代码如下:
class Program
{
static void Main(string[] args)
{
MallarDuck mallard = new MallarDuck();
mallard.Display();
mallard.Swim();
mallard.performQuack();
mallard.performFly();
mallard.SetFlyBehavior(new FlyRockePowered());
mallard.performFly();
}
}
结果:

动态添加了吧?修改一下很容易吧?