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

简介: 原文 第6章 适配器模式(Adapter Pattern) 概述   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。  解决的问题   即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

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

概述

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

 解决的问题

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

注:

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

类关系图

举例:

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

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


   设计模式系列文章入口

目录
相关文章
|
6月前
|
设计模式
设计模式8 - 适配器模式【Adapter Pattern】
设计模式8 - 适配器模式【Adapter Pattern】
23 0
|
2月前
适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern)
35 1
|
Java 程序员 API
结构型模式 - 适配器模式(Adapter Pattern)
结构型模式 - 适配器模式(Adapter Pattern)
|
应用服务中间件 智能硬件 容器
结构型模式 - 外观模式(Facade Pattern)
结构型模式 - 外观模式(Facade Pattern)
|
设计模式 Java 程序员
适配器模式(Adapter Pattern)
适配器模式是一种结构型设计模式, 它能将接口转换为客户期望的另一个接口,也就是说它能使接口不兼容的对象能够相互合作。
100 0
适配器模式(Adapter Pattern)
|
Java
装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern)
71 0
装饰器模式(Decorator Pattern)
|
设计模式 Java 数据库连接
门面模式 Facade Pattern
主要内容有: 该模式的介绍,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的代码示例:熟悉该模式的代码长什么样子 该模式的优缺点:模式不是万金油,不可以滥用模式 该模式的应用案例:了解它在哪些重要的源码中被使用
130 0
|
设计模式 C#
【愚公系列】2021年12月 二十三种设计模式(六)-适配器模式(Adapter Pattern)
【愚公系列】2021年12月 二十三种设计模式(六)-适配器模式(Adapter Pattern)
102 0
【愚公系列】2021年12月 二十三种设计模式(六)-适配器模式(Adapter Pattern)
|
Java C#
使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有个老系统, 现在来了个新供应商的类, 但是它们的接口不同, 如何使用这个新供应商的类呢? 首先, 我们不想修改现有代码, 你也不能修改供应商的代码.
1722 0

热门文章

最新文章