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

时间:2022-09-14 14:54:30

原文 第6章 适配器模式(Adapter Pattern)

概述

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

 解决的问题

  即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

注:

在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式对象适配器模式。由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、java等语言都不支持多重继承,因而这里只是介绍对象适配器。

类关系图

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

举例:

比如我们目前公司采用一个第三方日记记录的方法,随着版本的更新,第三方已经不提供旧版本的方法,提供了一个新版本的方法,方法名跟类命都不一样了。但是我们又想继续用旧版本的方法,而第三方的源码我们又不能修改,所以我们就可以用一个适配器来解决。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    /// <summary>
    /// 旧版本的方法
    /// </summary>
    class FileWriteLog 
    {
       
        public void Write()
        {
            Console.WriteLine("旧版本写入日记方法");
        }
    }
    /// <summary>
    /// 新版本
    /// </summary>
    class NewFileWriteLog
    {
        public void NewWrite()
        {
            Console.WriteLine("新版本的写入日记的方法");
        }
    }

我们定义一个适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    /// <summary>
    /// 适配器
    /// </summary>
    class Adapter 
    {
        private NewFileWriteLog write = new NewFileWriteLog();
        //这里调用新的吸入方法
        public void Write()
        {
            write.NewWrite();
        }
    }
     
    //client
    class Program
    {
        static void Main(string[] args)
        {
            Adapter adapter = new Adapter();
            adapter.Write();
        }
    }

上面的写法特别的简单,主要是让大家能理解里面的核心,适配器是怎么运作的,就像我们的笔记本适配器一样。

当然在正常的接口定义中肯定也不可能这么的简单,起码第三方的提供的接口,要有一定的重写,继承等功能,这样方便我们调用的时候进行一定的封装,以便后续进行一键修改。

我们修改下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    /// <summary>
    /// 旧版本的方法
    /// </summary>
    class  FileWriteLog 
    {
 
        public virtual void Write()
        {
            Console.WriteLine("旧版本写入日记方法");
        }
    }
     
        /// <summary>
    /// 新版本
    /// </summary>
    class NewFileWriteLog
    {
        public void NewWrite()
        {
            Console.WriteLine("新版本的写入日记的方法");
        }
    }
 
 
    /// <summary>
    /// 适配器
    /// </summary>
    class Adapter : FileWriteLog
    {
        private NewFileWriteLog write = new NewFileWriteLog();
        //这里调用新的吸入方法
        public override void Write()
        {
            write.NewWrite();
        }
    }
     
     
    class Program
    {
        static void Main(string[] args)
        {
            FileWriteLog adapter = new Adapter();
            adapter.Write();
        }
    }

我们可以用简单工厂对对象的实例化进行封装,这样下次在有改动就需要修改工厂里面的实例化对象即可

1
 FileWriteLog adapter = new Adapter();

优点

通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。

复用了现存的类,解决了现存类和复用环境要求不一致的问题。

将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

缺点

     在一些场景下更换适配器的实现过程比较的复杂

适用的场景

系统需要使用现有的类,而这些类的接口不符合系统的接口。

想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

两个类所做的事情相同或相似,但是具有不同接口的时候。

旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

.net中的适配器模式

Adapter模式在.NET Framework中的一个最大的应用就是COM Interop。COM Interop就好像是COM和.NET之间的一条纽带,一座桥梁。我们知道,COM组件对象与.NET类对象是完全不同的,但为了使COM客户程序象调用COM组件一样调用.NET对象,使.NET程序像使用.NET对象一样使用COM组件,微软在处理方式上采用了Adapter模式,对COM对象进行包装,这个包装类就是RCW(Runtime Callable Wrapper)。RCW实际上是runtime生成的一个.NET类,它包装了COM组件的方法,并内部实现对COM组件的调用。

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


   设计模式系列文章入口

第6章 适配器模式(Adapter Pattern)的更多相关文章

  1. 二十四种设计模式:适配器模式&lpar;Adapter Pattern&rpar;

    适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...

  2. 设计模式 - 适配器模式&lpar;adapter pattern&rpar; 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  3. 乐在其中设计模式&lpar;C&num;&rpar; - 适配器模式&lpar;Adapter Pattern&rpar;

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  4. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

  5. 怎样让孩子爱上设计模式 —— 7&period;适配器模式&lpar;Adapter Pattern&rpar;

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  6. 设计模式 - 适配器模式&lpar;adapter pattern&rpar; 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  7. 设计模式系列之适配器模式&lpar;Adapter Pattern&rpar;——不兼容结构的协调

    模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...

  8. 设计模式&lpar;七&rpar;&colon; 通过转接头来观察&quot&semi;适配器模式&quot&semi;&lpar;Adapter Pattern&rpar;

    在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...

  9. 适配器模式&lpar;Adapter Pattern&rpar;

    适配器模式概述 定义:将一个类的接口转化成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作.别名(包装器[Wrapper]模式) 它属于创建型模式的成员,何为创建型模式:就是关注如何将 ...

  10. 七个结构模式之适配器模式&lpar;Adapter Pattern&rpar;

    定义: 将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern). 结构图: Target:目标抽象类,客户所需要的接口. Adapt ...

随机推荐

  1. RDCManager&lpar;远程登录工具&rpar;

    1: 2: 3: 4: 5 6 写文不易,转载请注明出处:http://www.cnblogs.com/zszs/p/5662752.html

  2. GridView 控件中如何绑定 CheckBoxList

    需求:设计这样一个页面,在页面上可以选择和展示各省份对应的文明城市? 思路:一次性查询出所需的记录(查询数据库的操作不宜写到 C# 代码的循环语句中),并保存到全局变量中,之后根据条件过滤出需要的.可 ...

  3. 关于MD5加密的小知识

    - (NSString *)MD5Hash { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5(cStr, ...

  4. unix 文件属性

    在unix下提到文件属性,不得不提的一个结构就是stat,stat结构一般定义如下: struct stat { dev_t st_dev; /* ID of device containing fi ...

  5. 自定义NavigationView&&num;39&semi;s item 的高度

    http://*.com/questions/31204320/how-can-i-change-the-navigationviews-item-text-size 自定义s ...

  6. 负载均衡服务器session共享的解决方案

    在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了S ...

  7. VC&plus;&plus;中调用cmd的集中方式

    1. system方法: 原型: int __cdecl system(const char *); 例如: system("ipconfig"); 2. WinExec方法: 相 ...

  8. Mysql数据库连接查询

                                    Mysql数据库连接查询 连接是关系数据库模型的主要特点.连接查询是关系数据库中最主要的查询,主要包括内连接.外连接等.通过连接运算可以 ...

  9. Android Chromium WebView学习启动篇

    Android从4.4起提供基于Chromium实现的WebView.此前WebView基于WebKit实现.WebKit提供网页解析.布局和绘制以及JS执行等基础功能.Chromium在WebKit ...

  10. book项目分析

    需求1:用户注册 需求如下: 1)访问注册页面 2)填写注册信息,提交给服务器 3)服务器应该保存用户 4)当用户已经存在----提示用户注册 失败,用户名已存在 5)当用户不存在-----注册成功 ...