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

我想要是说适配器模式,提一下“电压”、“耳机”、“充电器”和 "USB”  的例子应该是比较恰当的了。就说说自己的亲身经历,我原来的手机是NOKIA5730。后来也不知道有没有国行,但是不推荐大家买这款手机,不适用的哈。我买的时候只有港货,可是大家知道的啊,香港的充电器和我们大陆的充电器规格是不一样的,那我要是在国内充电,原机带的充电器根本用不了,所以要花25RMB买一个公牛的适配器,这样才可以充电!!

1.初识适配器模式

我想作为一个IT人士,对于适配器应该不陌生,只不过要从理论上讲可能描述的不够到位。实际上,好多系统的开发,都要用到第三方软件,这样的话,第三方软件的接口和我们开发的软件的接口往往是不一致的,那么这时候就要“适配”了。看看GoF对适配器模式的说法:



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



一般情况下,适配器包含下面的几个角色:

目标抽象角色(Target) : 定义客户所期待要使用的接口,我们把手机当做客户端,客户端所需要使用充电器是大陆标准。

源角色(Adaptee) : 需要被适配的接口,在这里指的是我的手机买的时候自带的港版充电器。

适配器角色(Adapter) :用来把源接口转换成符合要求的目标接口的设备,在这里指的是我自己买的公牛的适配器。

客户端(Client) :这里指的就是我那个港版的手机了。

现在来看看适配器模式的结构图:

              

注:这里我们只说一致适配器模式:对象适配器模式,而不谈类适配器模式。

2.实现适配器模式的例子

现在,我们看看适配器模式到底是怎么实现的,怎么就能“在大陆使用港版的充电器了呢??”

观察代码和运行结果,得知策略模式确实是实现了!!确实完成了在大陆使用港版充电器的目的了。那么我们想一想利用适配器模式有什么好处呢?不妨假设一下,现在我又在欧洲买了一个手机,这时手机又不能再大陆充电了,怎么办呢?这时我们只需要在写一个类继承TargetCharget类完成对欧版充电器的适配,这样我们有能很方便的会用欧洲的手机。怎么样?使用适配器模式还能提供统一的接口。
3.实现适配器模式的场合和好处

首先,必须强调的是,适配器模式适用于使用第三方软件的情况,并且第三方软件提供的接口和我们开发的系统接口不一致,同时我们正在开发的系统想要改变接口已经不容易了,这时候使用适配器就比较好。其实,适配器模式更像是一个弥补型的模式,当接口不一致时,并且系统开发已经进入了很难改变的时候,这时候可以使用适配器模式,但是如果在开发的早期就发现了接口不一致,尽量不要采用适配器模式,而是最后把接口设计的一致比较好。也就是说适配器模式大部分在软件开发后期使用的一种设计模式。

具体适用的场合:

1.正在开发的系统想使用一个已经存在的类,并且该类很重要,但是该类提供的接口和系统不一致。

2.使用了第三方软件,并且第三方提供的软件的接口和系统不一致。

3.两个已经存在的类完成的功能一致,但是接口不一样。可以采用适配器模式,提供一致的接口。

4.对旧系统的复用。

使用适配器模式的好处:

1.充分利用已经存在的资源,实现软件的复用,节省开发成本和时间。

时间: 2024-11-05 12:33:51

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

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

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

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

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

如何让孩子爱上设计模式 —— 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

JavaScript设计模式 Item9 --适配器模式Adapter

适配器模式(转换器面模式),一般是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况.适配器模式的作用是解决两个软件实体间的接口不兼容的问题. 一.定义 适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作.速成包装器(wrapper). 适配器的别名是包装器(wrapper),这是一个相对简单的模式.在程序开发中有许多这样的场景:当我们试图

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

转载:<JAVA与模式>之适配器模式 这个总结的挺好的,为了加深印象,我自己再尝试总结一下 1.定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作.      (太官方了,不太好理解, 其实就是要用到两个不相关的类/接口,但是又没有源代码,或者不想修改源代码,而增加一个类来完成合并使用的目的) 2.实现这个目的有两个方法,继承或者组合 2.1.使用继承(就是所谓的类适配器模式) 2.2.使用组合(所谓的对象适配器模式)

设计模式之适配器模式 adapter 适配器模式分类概念角色详解 类适配器 对象适配器 接口适配器 双向适配器

现实世界中的适配器模型 先来看下来几个图片,截图自淘宝 上图为港版的插头与港版的插座 上图为插座适配器卖家的描述图 上图为适配后的结果 现实世界中适配器模式 角色分类 这就是适配器模式在电源插座上的应用 我们看下在插座适配器中的几个重要角色 可以看得出来,大陆和港版插座面板,都是作为电源的角色,他们的功能是相似的或者说相近的 插头要使用插座,进而接通电流 现实世界到代码的转换 电源插座代码示例 港版插座面板 package adapter; /**目标角色 Target 接口 * 香港地区使用的

【设计模式】—— 适配器模式Adapter

前言:[模式总览]——————————by xingoo 模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器] Target 目标接口 Adaptee 现有的类 Adapter 中间转换的类,即实现了目标接口,又继承了现有的类. 1 package com.xingoo.test1; 2 interface Target{ 3 public voi

设计模式之适配器模式 Adapter

从现在开始,将转入设计模式中的结构型模式 定义与角色 工作场景 代码实现 /** * 被适配的类--相当于键盘 * @author bzhx * 2017年3月10日 */ public class Adaptee { public void request(){ System.out.println("可以完成客户请求的需要的功能"); } } Adaptee类 public interface Target { void handleReq(); } Target 接口 /** *