你的位置:首页 > ASP.net教程

[ASP.net教程]《Head First设计模式》C#实现(二)——适配器模式


  适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

 

  如果它走起路来像只鸭子,叫起来像只鸭子,那么它必定可能是一只鸭子包装了鸭子适配器的火鸡……

  最近有一个鸭子选美大赛,比赛项目是叫声和飞行距离。我养的是一只野火鸡,但我想让它伪装成鸭子去参加比赛。首先所有鸭子会叫也会飞,即所有鸭子都实现鸭子接口

interface Duck  {     void quack();//鸭子呱呱叫     void fly();//鸭子会飞  }

   所有火鸡也需要实现一个接口

interface Turkey  {     void gobble();//火鸡咯咯叫     void fly();//火鸡会飞,虽然飞不远  }

  比赛的对手是绿头鸭

 class MallardDuck : Duck  {    public void quack()    {      Console.WriteLine("呱呱呱");    }    public void fly()    {      Console.WriteLine("我在飞");    }  }

  我的野火鸡

 class WildTurkey : Turkey  {    public void gobble()    {      Console.WriteLine("咯咯咯");    }    public void fly()    {      Console.WriteLine("我飞了很短一段距离");    }  }

  比赛的流程如下

 static void testDuck(Duck duck)    {      duck.quack();      duck.fly();    }

  显然我的野火鸡接口不同,不能公然拿来使用,但是我们可以给他伪装一下,伪造一个鸭子血统

 class TurkeyAdapter : Duck  {    Turkey turkey;    public TurkeyAdapter(Turkey turkey)    {      this.turkey = turkey;    }    public void quack()    {      turkey.gobble();//独特的叫声或许是加分项    }    public void fly()    {      for (int i = 0; i < 5; i++)      {        turkey.fly();//飞的不够远就多飞几次      }    }  }

  好了,现在我的野火鸡也可以参加鸭子大赛了,不过在此之前,我的野火鸡将作为特邀嘉宾先上场表演

 static void Main(string[] args)    {      MallardDuck duck = new MallardDuck();      WildTurkey turkey = new WildTurkey();      Duck turkeyAdapter = new TurkeyAdapter(turkey);      Console.WriteLine("特邀嘉宾(火鸡)上场");      turkey.gobble();      turkey.fly();      Console.WriteLine("\n鸭子一号(绿头鸭)上场");      testDuck(duck);      Console.WriteLine("\n鸭子二号(伪装成鸭子的火鸡)上场");      testDuck(turkeyAdapter);      Console.ReadKey();    }

  我的火鸡就这样顺利的参加了鸭子大赛