zoukankan      html  css  js  c++  java
  • 设计模式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("
    鸭子一号(绿头鸭)上场");
                testDuck(duck);
                Console.WriteLine("
    鸭子二号(伪装成鸭子的火鸡)上场");
                testDuck(turkeyAdapter);
                Console.ReadKey();
            }

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

  • 相关阅读:
    Linux中OCI开发库的配置
    makefile中的gcc -o $@ $^是什么意思?
    【转】gcc中的-w -W和-Wall选项
    【转】Linux查看系统是32位还是64位方法总结
    【转】gcc命令中参数c和o混合使用的详解
    Python2.7设置在shell脚本中自动补全功能的方法
    Python3设置在shell脚本中自动补全功能的方法
    Pyqt图标下载网站
    如何使QLineEdit禁止编辑
    python偏函数的运用
  • 原文地址:https://www.cnblogs.com/castdream/p/4738910.html
Copyright © 2011-2022 走看看