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

  

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

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

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 = ; i < ; 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();
}

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

设计模式C#实现(二)——适配器模式的更多相关文章

  1. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

  2. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  3. 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)

      桥接模式Bridge   Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来   意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展.  意图解析 依赖倒置原 ...

  4. php设计模式课程---8、适配器模式是什么

    php设计模式课程---8.适配器模式是什么 一.总结 一句话总结: 充电过程中,手机充电器相对于手机和插座之间就是适配器 1.编程中的适配器是怎么回事? 写一个类(适配器),将传入的数据的格式或者内 ...

  5. 设计模式学习(二十四):Spring 中使用到的设计模式

    设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...

  6. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

  7. JAVA设计模式——第 8 章 适配器模式【Adapter Pattern】(转)

    好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电 ...

  8. Java设计模式(9)适配器模式(Adapter模式)

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用 ...

  9. Java 设计模式系列(二十)状态模式

    Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...

随机推荐

  1. [水煮 ASP.NET Web API 2 方法论] 目 录

    一.ASP.NET 中的 Web API [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API 与 ASP.NET MVC 在同一个进程 ...

  2. 对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。

    问题原因: 1.非空列未插入值错误 2.内容长度超过列最大长度(超过数据库设置长度,或者自定义长度“[StringLength(50, MinimumLength = 6, ErrorMessage ...

  3. java 接口学习

    你应该知道接口是一种契约,它与实现方式无关 但是类,即使是抽象类,你都能自定义成员变量,而成员变量往往就与实现方式有关. 这一点的实际意义不大. 但是有一点,类会暴露太多不必要,甚至不能暴露的东西,你 ...

  4. 关于 hangfire 的权限问题

    hangfire 是一个分布式后台执行服务. 官网:http://hangfire.io/ 我看中hangfire的地方是 1:使用简单 2:多种持久化保存方案.支持sqlserver ,msmq等 ...

  5. 使用SignalR+Asp.net创建实时聊天应用程序

    一.概述: 使用 ASP.NET 那么 SignalR 2 创建一个实时聊天应用程序.将 SignalR 添加 MVC 5 应用程序中,并创建聊天视图发送并显示消息. 在Demo中,将学习Signal ...

  6. KM算法

    链接: http://blog.csdn.net/lvshubao1314/article/details/41702291 

  7. [moka摘录]查看邮件是否已被阅读

    原文地址:http://www.php100.com/html/php/hanshu/2013/1101/6347.html 查看邮件是否已被阅读 当你在发送邮件时,你或许很想知道该邮件是否被对方已阅 ...

  8. hdu 1518 拼正方形

    本题来自:http://acm.hdu.edu.cn/showproblem.php?pid=1518 题意:输入几个长度,判断能否拼成正方形. 以下部分参考了网友代码,终于ac啦. #include ...

  9. jDiameter介绍以及使用

    jDiameter是Diameter协议的开源实现(比较不幸的是AGPL 3.0协议),项目地址https://github.com/RestComm/jdiameter. 项目框架 jDiamete ...

  10. WP修改ProgressBar的前景色

    重载默认主题中的值,修改ProgressBar的前景色 做一个小项目时,用到 ProgressBar添加一个加载效果,但是背景不是白色的,调试时发现自己选的主题色与背景色相近,特别不清晰,加载效果几乎 ...