适配器模式(Adapter Pattern)

原创 2012年03月27日 22:29:31

适配器模式(Adapter Pattern):
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的
那些类可以一起工作。

/// <summary>
    /// Target类:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
    /// </summary>
    public class Target
    {
        public virtual void Request()
        {
            Console.WriteLine("普通请求");
        }
    }

    /// <summary>
    /// 需要适配的类
    /// </summary>
    class Adaptee
    {
        public void SpecificRequest()
        {
            Console.WriteLine("特殊请求");
        }
    }

    /// <summary>
    /// 通过在内部包装一个Adaptee对象,把源接口转换成目标接口
    /// </summary>
    class Adapter : Target
    {
        private Adaptee adaptee = new Adaptee();

        //这样就可以把表面上调用Request()方法变成实际调用SpecificRequest()
        public override void Request()
        {
            adaptee.SpecificRequest();
        }
    }

    class Program
    {
        static void Main()
        {
            Target target = new Adapter();
            target.Request();
        }

    }

优势和缺陷:
适配器模式可以将一个类的接口和另一个类的接口匹配起来,使用的前提是你不能修改或不想修改原来的适配器母接口(Adaptee)
。例如,你向第三方购买了一些类、控件,但没有源程序,这是使用适配器模式,可以统一对象的访问接口。但客户调用可能需要
变动。

应用:
(1)对象需要利用现存的并且接口不兼容的类
(2)需要创建可重用的类协作其它接口不一定兼容的类
(3)需要使用若干个现存的子类但又不想派生这些子类中的每一个接口。

实例:篮球翻译

 

/// <summary>
    /// 球员类,有进攻和防守的方法
    /// </summary>
    public abstract class Player
    {
        protected string name;
        public Player(string name)
        {
            this.name = name;
        }
        //进攻
        public abstract void Attack();
        //防守
        public abstract void Defence();
    }

    /// <summary>
    /// 前锋类
    /// </summary>
    public class Forwards : Player
    {
        public Forwards(string name)
            :base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine("前锋{0}进攻",name);
        }

        public override void Defence()
        {
            Console.WriteLine("前锋{0}防守",name);
        }
    }

    /// <summary>
    /// 中锋类
    /// </summary>
    public class Center : Player
    {
        public Center(string name)
            : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine("中锋{0}进攻", name);
        }

        public override void Defence()
        {
            Console.WriteLine("中锋{0}防守", name);
        }
    }

    /// <summary>
    /// 后卫类
    /// </summary>
    public class Guards : Player
    {
        public Guards(string name)
            : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine("后卫{0}进攻", name);
        }

        public override void Defence()
        {
            Console.WriteLine("后卫{0}防守", name);
        }
    }

    /// <summary>
    /// 外籍中锋
    /// Adaptee类,需要适配的类
    /// </summary>
    public class ForeignCenter
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        //说明外籍中锋只懂得中文进攻
        public void 进攻()
        {
            Console.WriteLine("外籍中锋{0}进攻",name);
        }
        //外籍中锋只懂得中文防守
        public void 防守()
        {
            Console.WriteLine("外籍中锋{0}防守",name);
        }

    }

    /// <summary>
    /// 翻译类:Adapter类
    /// </summary>
    public class Translator : Player
    {
        private ForeignCenter wjzf = new ForeignCenter();

        public Translator(string name)
            : base(name)
        {
            wjzf.Name = name;
        }

        //翻译者讲Attack翻译为进攻告诉外籍中锋
        public override void Attack()
        {
            wjzf.进攻();
        }

        public override void Defence()
        {
            wjzf.防守();
        }
    }

 

客户端调用

//适配器模式
            AdapterPattern.Player player1 = new AdapterPattern.Forwards("巴蒂尔");
            player1.Attack();

            AdapterPattern.Player player2 = new AdapterPattern.Guards("艾克斯雷迪");
            player2.Attack();

            //翻译告诉姚明,教练要求进攻和防守
            AdapterPattern.Player yaoming = new AdapterPattern.Translator("姚明");
            yaoming.Attack();
            yaoming.Defence();


 

第7章 适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中...

Java实现(06)——适配器模式(Adapter Pattern)

适配器模式用于连接两个不兼容的接口,生活中的一个例子就是笔记本需要通过读卡器读取内存卡中的数据,读卡器就相当于适配器。 本例中使用MediaAdapter继承MediaPlayer接口,同时使用Ad...
  • WAN_EXE
  • WAN_EXE
  • 2016年12月07日 20:35
  • 144

适配器模式【Adapter Pattern】

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

适配器模式【Adapter Pattern】

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

适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)   以下内容是我和小组的兄弟学习设计模式我做的课件,我整理出来和大家分享,有不妥之处敬请指出.  上次做的桥接模式(Bridge),这次是适配器模...

适配器模式(Adapter Pattern)

适配器模式: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 生活中的例子: 1.在日常生活中我们经常碰见一些无法直接对...

适配器模式(Adapter Pattern)

今天我们要学习的是设计模式中的适配器模式,适配器模式其实也比较好理解,光从它的名字我们都能理解个所以然了。 适配器模式定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口...

5. Adapter Pattern(适配器模式)

一、 适配器(Adapter)模式 概述: 在软件开发过程中,我们要经常要复用我们以前开发的一些“现存对象”,但是这些“现存对象”并不能满足我们新的应用环境。怎样才能良好的复用这些对象...
  • enlyhua
  • enlyhua
  • 2015年04月03日 10:28
  • 349

适配器模式-Adapter Pattern

基本概念 适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那个类可以一起工作。 适配器模式类结构图 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:适配器模式(Adapter Pattern)
举报原因:
原因补充:

(最多只允许输入30个字)