Adapter 适配器模式(设计模式03)-阿里云开发者社区

开发者社区> 衣舞晨风> 正文

Adapter 适配器模式(设计模式03)

简介: 疑问: 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。 如何应对这种“迁移的变化”? 如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口? 定义: 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
+关注继续查看

疑问:

  • 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。 如何应对这种“迁移的变化”?
  • 如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

定义:

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
——《设计模式》GoF

一、对象适配器

对象适配器采用对象组合,通过引用一个类与另一个类接口 在对象适配器中通过组合获得Adaptee对象 通过调用Adaptee对象的方法,转换后返回Target结果。

这里写图片描述

这里写图片描述

二、类适配器

类适配器通过多继承对一个接口与另一个接口进行匹配。
Target定义了Client使用的与特定领域相关的接口,Client通过调用Target实现某一个特定的操作。Adaptee是一个已经存在的类,需要与Target协同工作,这个接口需要适配。Adapter适配器适配Adaptee和Target接口。在类适配器中,通过继承获得Adaptee中的方法。

.NET不支持多重继承,因此当Target是一个类,而不是一个接口时无法实现类适配器,这时需要使用对象适配器。

这里写图片描述

三、生活中的例子

在国内使用的电源供电电压为220V,美国为380V,当你出差到美国,你的电器需要220V的电压,但旅馆里不提供220V,只提供380,所以,你到市场买了一个电源适配器,在接上适配器后,旅馆里的电源就可以使用在你的电器上了。

Target:标准电源
Adaptee:美国电源
Adapter:适配器

1、实现-Target

 /// <summary>
    /// 目标:Target
    /// </summary>
    public class StandardPower
    {
        /// <summary>
        /// 供电
        /// </summary>
        /// <returns></returns>
        public virtual int SupplyPower()
        {
            Console.Write("正常SupplyPower,电压:");
            return 220;
        }
    }

2、实现-Adaptee

 /// <summary>
    /// 要适配的对象:Adaptee
    /// </summary>
    public class AmericanPower
    {
        public int SupplyPower()
        {
            Console.Write("在美国供给380V电压");
            return 380;
        }
    }

3、实现-Adapter

 /// <summary>
    /// 适配器:Adapter
    /// </summary>
    public class PowerAdapter : StandardPower
    {
        /// <summary>
        /// 当地电源
        /// </summary>
        private AmericanPower localPower = new AmericanPower();
        public override int SupplyPower()
        {
            int v = localPower.SupplyPower();
            if (v != 220)
            {
                //这里做一些转换工作                
                v = 220;
            }
            Console.WriteLine("转换后的电压:{0}", v.ToString());
            return v;//转换后,即适配后
        }
    }

4、实现-使用

 StandardPower power = null;

            //在中国的时候
            power = new StandardPower();
            Console.WriteLine(power.SupplyPower());

            //到美国以后,买一个适配器
            power = new PowerAdapter();
            Console.WriteLine("适配后提SupplyPower源电压为:{0}", power.SupplyPower());

            //让控制台 等待
            Console.ReadLine();

四、.NET中的Adapter模式

1.适配器模式在.NET Framework中的一个最大的应用就是COM Interop。

COM Interop就好像是COM和.NET之间的一座桥梁(关于COM互操作更多内容可以参考我的互操作系列)。COM组件对象与.NET类对象是完全不同的,但为了使.NET程序
象使用.NET对象一样使用COM组件,微软在处理方式上采用了Adapter模式,对COM对象进行包装,这个包装类就是RCW(Runtime Callable Wrapper)。RCW实际上是runtime生成的一个.NET类,它包装了COM组件的方法,并内部实现对COM组件的调用。如下图所示:
这里写图片描述

2..NET中的另外一个适配器模式的应用就是DataAdapter。

ADO.NET为统一的数据访问提供了多个接口和基类,其中最重要的接口之一是IdataAdapter。DataAdpter起到了数据库到DataSet桥接器的作用,使应用程序的数据操作统一到DataSet上,而与具体的数据库类型无关。甚至可以针对特殊的数据源编制自己的DataAdpter,从而使我们的应用程序与这些特殊的数据源相兼容。

五、实现要点

适配器模式重在转换接口,它能够使原本不能在一起工作的两个类一起工作,所以经常用在类库复用,代码迁移等方面,有一种亡羊补牢的味道

类适配器和对象适配器可以根据具体实际情况来选用,但一般情况建议使用对象适配器模式

六、效果

通过类的继承或者对象的组合转换已有的接口为目标接口

七、适用性

需要使用一个已经存在的类,但接口与设计要求不符。

希望创建一个可以复用的类,该类可以与其他不相关的类或者是将来不可预见的类协同工作。

八、总结

Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况” ,在遗留代码复用、类库迁移等方面非常有用。

GoF 23 定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

Adapter模式可以实现的非常灵活,不必拘泥于Gof23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。

Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便地适配。

作者:jiankunking 出处:http://blog.csdn.net/jiankunking

源码下载:http://download.csdn.net/detail/xunzaosiyecao/9543274
小注:
本文部分资料整理自网络,在此表示感谢。
1、 C#设计模式(7)——适配器模式(Adapter Pattern)

2、本杰.NET 张波的PPT资料

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
源码专题之spring设计模式:动态代理
jdk动态代理 代码实现 满足代理模式应用场景的三个必要条件 两个角色:执行者、被代理对象 注重过程,必须要做,被代理对象没时间做或者不想做(怕羞羞),不专业 执行者必须拿到被代理对象的个人资料(执行者持有被代理对象的引用) jdk的动态代理通过调用Proxy.
2109 0
安卓开发_浅谈ListView(ArrayAdapter数组适配器)
列表视图(ListView)以垂直的形式列出需要显示的列表项。   实现过程:新建适配器->添加数据源到适配器->视图加载适配器   在安卓中,有两种方法可以在屏幕中添加列表视图 1、直接用ListView组件创建 2、让Activity继承ListActivity实现   一、xm...
846 0
Adapter 适配器模式(设计模式03)
疑问: 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。 如何应对这种“迁移的变化”? 如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口? 定义: 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
1738 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
9188 0
Adapter(适配器)模式
1. 概述:          接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。         例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器。
794 0
IOS设计模式第六篇之适配器设计模式
版权声明:原创作品,谢绝转载!否则将追究法律责任。 那么怎么使用适配器设计模式呢? 这个之前提到的水平滚动的视图像这样: 为了开始实现他,我们创建一个新的继承与UIView的HorizontalScroller 类。
851 0
+关注
衣舞晨风
http://blog.csdn.net/jiankunking
701
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载