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

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

时间: 2024-10-08 11:13:48

《Head First设计模式》C#实现(二)——适配器模式的相关文章

设计模式之十二:Proxy(代理)—对象结构型模式

2014-05-29 星期四 21:08:37  Proxy,继续GOF.此模式未按GOF编写. c++中使用StringBuilder 1.Intent Provide a surrogate or placeholder for another object to control access to it. 为其他对象提供一种代理以控制对这个对象的访问. 2.Also Known As 3.Motivation 4.Applicability 在以下情况使用适配模式: ● 创建开销大的对象时

设计模式(十二)外观模式(结构型)

概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?  解决方案                                    

Java设计模式(八) 适配器模式

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/design_pattern/adapter/ 适配器模式介绍 适配器模式定义 适配器模式(Adapter Pattern),将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式类图 适配器模式类图如下 适配器模式角色划分 目标接口,如上图中的ITarget 具体目标实现,如Concr

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

23种设计模式介绍(二)---- 结构型模式

由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模式介绍(三)---- 行为型模式 设计模式都是比较抽象的概念,所以大家一定要确保看懂类图而后再自己写代码加强记忆. 概述 结构型模式共七种: 适配器模式(Adapter) 外观模式(Facade) 桥接模式(Bridge) 装饰器模式(Decorator) 代理模式(Proxy) 享元模式(Flyw

设计模式----看大话设计模式笔记(二)

9.原型模式(Prototype): 用原型实例指定创建对象的种类,并通过拷贝这些原型创建行的对象. UML图: 原型模式其实就是从一个对象创建另一个可定制的对象,并且不需要知道任何创建的细节. .NET 中实现ICloneable接口即可. 一般在初始化信息不发生变化的情况下,克隆是最好的办法,隐藏了对象创建的细节,又提高了性能. MemberwiseClone()方法,如果字段是值类型,对该字段进行逐位复制:如果是引用类型,复制引用但是不复制引用的对象,因此原始对象及产生的副本引用同一对象.

《Head First 设计模式》学习笔记——适配器模式 + 外观模式

在ADO.NET中,对于我们从数据库中取出的数据都要放到一个DataSet中,不管你是Access的数据库,还是SQL的数据库,或者是Oracle的数据库都要放到DataSet中..NET中并没有提供如:SqlDataSet.OleDbDataSet.OracleDataSet等,它只提供了一种DataSet就是用SqlDataAdapte等去填充数据:为什么这一个DataSet能存放不同的数据呢?就是有这些适配器来适配.----题记 设计模式 适配器模式:将一个类的接口,转换成客户期待的另一个

小故事学设计模式之Decorate: (二)老婆的新衣服

老婆有一件蓝色的裙子和一件粉色的裙子, 不管怎么穿,她还是原来的老婆. 但是在软件里就不一定了, 如果把老婆比作一个class的话, 有一种做法是会因为增加了两个新的Property而继承出两个子类: "穿裙子的老婆, 穿粉色上衣的老婆". 你这样弄出两个子类也没什么不对, 问题是当MM的有上百件服装的时候,就会产生上百个子类,这个不好,将来万一父类一变化,下面上百个子类都要一个个地去修改,太乱了. 有一个更合理的方式来解决这个"老婆的装饰问题".我们的要求是:  

设计模式(十二): Flyweight享元模式 -- 结构型模式

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

设计模式理解(二)创建型——单例、原型

设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局唯一的实例的引用.碰到并发之类就呵呵了. 这么简单都能画个UML图,还煞有介事似的,我晕. -----------------------   分割线   ------------------------ 原型(Prototype) 我理解就是给一个类糊弄个cloneable之类的接口,让它自己决定