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

  作为一个码农,天天都要面对电脑。知道电脑一直在不停的升级换代。电脑的很多零件接口也不断的变化。如果你曾经花巨资采购的一台电脑在使用一段时间后,发现硬盘空间不够使用,需要加一块硬盘,在加的时候才发现新硬盘和电源线插口不匹配。这时候,网络硬件维护人员的同事,给了你一根转换线,一头是旧的串行接口,一头是新的并行接口。通过这个转换线,完美的解决了老电源上和新的硬盘之间的不匹配问题。这里的转换线担任的就是功能就是适配器模式要解决的问题。

通过上面生活中例子,进一步分析,适配器模式就是解决两个事物,在需要对接的时候,发现两者之间是有些冲突的,不能完美的对接起来。为了解决这个问题,就加入一个第三方事物,来解决两者不匹配问题。通过这个思路咱们看看这个定义:

  将一个类的接口转换成客户客户希望的另外一个接口,适配器模式使得原来由于接口不兼容问题不能再一起对接的那些类可以在一起工作。

  通过上面的介绍了解了适配器模式解决的问题场景,下面我们就举个例子更清晰的熟悉适配器模式。

  软件公司开内部会议,需要小王和小李演示新功能,他们都解决了公司一个久未攻克的问题,一但老总认可了,会有一笔不菲的奖金。公司准备了一台是 VGA 接口的投影仪。实现如下:

1 //VGA投影仪
2 public class Projector {
3
4     public String myself = "VGA";
5
6     public String toString(){
7         return myself;
8     }
9 }

  小王开始演示了,他的电脑笔记本正好有一个 VGA 接口。实现如下:

 1 // VGA接头的接口
 2 public interface VGAInterface {
 3
 4     public void VGAwork(String chat);
 5
 6 }
 7
 8 public class VGAInterfaceImpl implements VGAInterface {
 9     private String thisObject = "VGA 接口";
10     @Override
11     public void VGAwork(String chat) {
12         // TODO Auto-generated method stub
13         // TODO Auto-generated method stub
14         if(thisObject.contains(chat)){
15             System.out.println("我是 VGA 接口,插入的是:"+chat + ",匹配");
16         }
17         else
18         {
19             System.out.println("我是 VGA 接口,插入的是:"+chat + ",不匹配");
20         }
21     }
22 }

   电脑连接上投影仪

 1 public class UseProjector {
 2
 3     public static void main(String[] args) {
 4
 5          Projector projector = new Projector();
 6
 7          VGAInterface vga = new VGAInterfaceImpl();
 8
 9          String cht = projector.toString();
10          vga.VGAwork(cht);
11     }
12 }    

/***********************************************************/控制台:我是 VGA 接口,插入的是:VGA,匹配

小王链接上了投影仪,顺利进行了演示,老总非常认可,一笔奖金就要到手,小王心里爽歪歪。

  接下来轮到小李进行演示了,在连接投影仪的时候才发现自己电脑上只有 HDMI 接口, HDMI 接口 如下

 1 public interface HDMIInterface {
 2
 3     public void HDMIwork(String Chat);
 4 }
 5
 6 public class HDMIInterfaceImpl implements HDMIInterface{
 7     private String thisObject = "HDMI 接口";
 8     @Override
 9     public void HDMIwork(String chat) {
10         // TODO Auto-generated method stub
11         if(thisObject.contains(chat)){
12             System.out.println("我是 HDMI 接口,插入的是:"+chat + ",匹配");
13         }
14         else
15         {
16             System.out.println("我是 HDMI 接口,插入的是:"+chat + ",不匹配");
17         }
18     }
19 }

  小李电脑和投影仪匹配结构是:

public class UseProjector {

    public static void main(String[] args) {
         Projector projector = new Projector();

        //VGAInterface vga = new VGAInterfaceImpl();
         HDMIInterface hdmi= new HDMIInterfaceImpl();
         String cht = projector.toString();
         hdmi.HDMIwork(cht);
    }
}

/******************************************/
我是 HDMI 接口,插入的是:VGA,不匹配

  没法连接上投影仪。小李顿时一脑门大汗,老总那么忙,今天不能演示的话,以后变数太大了。正当小李绝望之际,组长递过来一根转行线,可以把 HDMI 接口转换成 VGA 接口。用代码实现如下

//转换线  适配器类
public class Adapter extends VGAInterfaceImpl implements  HDMIInterface {

    // HDMI 接口转换成 VGA
    @Override
    public void HDMIwork(String chat) {
        VGAwork(chat);
    }
}

小李顿时喜出望外,通过转换线,进行连接投影仪

public class UseProjector {
    public static void main(String[] args) {
         Projector projector = new Projector();

        //VGAInterface vga = new VGAInterfaceImpl();
         //HDMIInterface hdmi= new HDMIInterfaceImpl();
         Adapter adapter = new Adapter();
         String cht = projector.toString();
         adapter.HDMIwork(cht);
    }
}

/************************************************/
我是 VGA 接口,插入的是:VGA,匹配

  小李看到结果匹配,高兴一蹦多高,终于可以顺利演示了。

简单总结

  上面这个例子就是典型的使用适配器解决了问题的例子,问题就是  投影器的 VGA 接口和 小李电脑的HDMI 接口不匹配的问题,通过用适配器模式来解决了这个问题。可以清晰的很出来,适配器模式有一些特点:

1、实在系统扩展过程或者添加的,不是在系统开发过程中设计的。

2、可以在系统扩展后,尽最大可能复用原来的代码

   3、一个系统如果使用适配器模式太多,就会造成混乱。

适配器实现方式

  适配器的实现方式有两种:类适配器、对象适配器。

类适配器:继承被适配的对象的类,然后实现需要适配成目标类的接口 。被适配对象类 : Adaptee,适配目标的对象的接口:Target。

public class Adapter extends Adaptee implements  Target{
     public void work(){
           Adaptee_work();
    }
}

对象适配器:实现需要适配成目标类的接口 。被适配的类当成一个属性。实现如下

 1 public class Adapter  implements  Target{
 2      // 被适配类
 3      private Adaptee adaptee;
 4
 5      public Adapter(Adaptee adaptee){
 6            this.adaptee = adaptee;
 7      }
 8
 9      public void work(){
10            adaptee.Adaptee_work();
11     }
12 }

  对象适配器和类适配器的区别就是:对象适配器可以适配多个类,而类适配器只能适配继承的那个类。而类适配器则可以部分重定义 被适配类的 部分行为。

双向适配器

  双适配器,那就那上面的例子来说。HDMI 接口可以转换成 VGA口,那么肯定也可以把 VGA 口转换成为 HDMI 口。在适配类中实现了两者的相互转换,就是双向适配器。

  例子上面的例子中,如果在显示前,VGA 接口的投影仪换了,换成了 HDMI 接口的投影仪,那么就需要把 VGA 接口转换成 HDMI 了,再考虑上面那种情况,这就是使用到双向适配器的地方了。下面来完善下代码

 1 //上面的例子演进的双适配器
 2 public class TwoAdapter implements VGAInterface,HDMIInterface {
 3
 4     public TwoAdapter(VGAInterfaceImpl VGA){
 5         this.VGA = VGA;
 6     }
 7
 8     public TwoAdapter(HDMIInterfaceImpl HDMI){
 9         this.HDMI = HDMI;
10     }
11
12     private VGAInterfaceImpl VGA;
13
14     private HDMIInterface HDMI;
15
16         // HDMI 转化 VGA
17     @Override
18     public void HDMIwork(String chat) {
19         // TODO Auto-generated method stub
20         VGA.VGAwork(chat);
21     }
22         // VGA 转化 HDMI
23     @Override
24     public void VGAwork(String chat) {
25         // TODO Auto-generated method stub
26         HDMI.HDMIwork(chat);
27     }
28 }    

双向适配器用的是对象适配器,也就是利用了对象适配器可以匹配多个 Adatee 的优势来完成的。

小结

适配器模式的适用范围是扩展或对接系统接口,而且是在有冲突不能再一起完好对接起来时候用到的。而不是在系统开发设计之初用到的模式。现实方式包括:对象适配器、类适配器、双向适配器,其实双向适配器是对象适配器的一种。

  说了这么多,总结起来适配器的本质就是:转换匹配,复用功能。

原文地址:https://www.cnblogs.com/pengweiqiang/p/10878381.html

时间: 2025-01-14 08:07:59

设计模式 — 适配器模式(Adapter)的相关文章

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 详解

适配器模式(adapter pattern) 枚举器和迭代器 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本的枚举器(Enumeration)和现在的迭代器(Iterator) 可以使用适配器(adapter)进行转换. 适配器(adapter)代码: /** *

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本号的枚举器(Enumeration)和如今的迭代器(Iterator) 能够使用适配器(adapter)进行转换. 适配器(adapter)代码: /**

Android设计模式--适配器模式--Adapter入门

今天,我们要梳理一下java设计模式的适配器模式. 适配器嘛,想一想我们平常用的电源适配器就知道了,就是把两个不兼容的东西搞通嘛,可以相互联系. 在java中也一样,就是让两个需要一起协调的类,通过适配器协调起来就行了,就是讲一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间.首先我们来看两个图,我们通常会有这样一个问题,厂商给我接口和我们现有接口对接不起来.旧的数据和新的数据接不起来等等. 解决这问题,在不改变原来两个接口的情况下,我们完全可以在写一个类,做个中间

设计模式之适配器模式(Adapter Pattern)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 1. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 模式中的角色 2.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 2.2 需要适配的类(Adaptee):需要适配的类或适配者类. 2.3 适配器(Adapter):通过包装一个需要适配的对象,把

研磨设计模式解析及python代码实现——(三)适配器模式(Adapter)

一.适配器模式定义 将一个类的接口转换成另外一个接口,适配器模式使得原本由于接口不兼容,而不能在一起工作的哪些类能够在一起工作. 二.python 实现 1 import string 2 import cPickle as p 3 import datetime 4 import os 5 class LogModel: 6 logId="" 7 operateUser="" 8 operateTime="" 9 logContent=&quo

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter.由于Class Adapter的实现需要用到多继承,而Java不支持多继承,所以这里只关注Object Adapter. 在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用.那么如果我们需要维护一些年代比较久远的代码,可能就会面临着没

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

基本概念 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式.适配器模式还有一个特例,就是缺省适配模式(Default Adapter),又称接口适配模式. 1. 类适配器模式 把适配类的API转换成目标类的API, 由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,虽然C#.java等 语言都不支持多重继承,但是也可以简单的使用类    

如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

如何让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 概念相关 定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 简单点说: 两个彼此间没有太大关联的类,想进行交互完成某些事情,如果 直接去修改各自的接口,就显得有些繁琐了,可以加个中间类, 用它来协调两类之间的关系,完成相关业务.这种玩法就叫适配器模式! 两种适配器模式: 根据适配器类与适配者类的关系不同,适配器模式可分为 类适配器 和 对

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

二十四种设计模式:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 示例有一个Message实体类,某个类对它的操作有Insert()和Get()方法.现在需要把这个类转到另一个接口,分别对应Add()和Select()方法. MessageModel using System; using System.Collections.Generic; using System.Text; name