设计模式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();
        }

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

 

posted @ 2015-08-18 11:24  妖刀Dreamcast  阅读(461)  评论(0编辑  收藏  举报