结构型—适配器模式

1、意图:

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

2、场景描述:

  手机的Usb数据线可以被看做适配器,不同类型的手机通过不同的Usb数据线连接到电脑相同的usb接口上。几年前的非智能手机,数据线连接手机的一端由于手机品牌的不同使用了各式各样的接口,但是连接电脑的一端却采用了相同usb接口。针对特定品牌的数据线使得每种不同的手机都可以连接到电脑的usb接口上,使得手机接口可以与电脑的usb接口协同工作。

  另外,C++中的栈(stack)、队列(queue)被称作容器适配器,它们本身都是基于线性表来实现的,但是对外提供了特定的操作接口,如stack的LIFO(last-in first-out)特性。

3、适配器模式类图:

  对象适配器类图:

  

角色

  • Client:用户类,使用新接口Target来完成某些特定的需求。
  • Target:新的接口类,开放特定接口request来完成某些特定操作,与Client协作。
  • Adaptee:原有的类。
  • Adapter:适配器类,将Adaptee中的接口封装成Target中的新接口,来满足新的需求。

协作

  • Client调用Adapter实例的操作,Adapter使用Adaptee来完成这些被调用的操作。

  • 类图中表示的是适配器模式两种类图中的对象适配器类图,另外一种类适配器通过多重继承两个类或实现两个接口来实现。

4、适用性:

  • 使用一个原本存在的类来满足新的需求,但是原来的类与新的需求类接口不一致。
  • 希望复用原有的类,但是某些方法在原有的类中不存在,通过Adapter类来修改原来类Adaptee中的接口,并且添加Adaptee中不存在的方法。

5、实例类图:

  

说明

  • UsbPort、PhonePort分别是电脑Usb端口、手机端口的类定义信息。
  • Human的将手机连接到电脑的操作(linkPhoneToComputer)使用UsbDataLine来完成。

6、代码实例:

  手机端口类,含有手机端口的信息,对应适配器模式中的Adaptee。

1 package com.crazysnail.adapter;
2
3 public class PhonePort {
4     public void getPhonePort(){
5         System.out.println("我是一个手机接口");
6     }
7 }

  Usb端口类,满足将设备连接到电脑的新需求,对应适配器模式中的Target。

1 package com.crazysnail.adapter;
2
3 public class UsbPort {
4     public void getUsbPort(){
5         System.out.println("我是一个usb接口");
6     }
7 }

  数据线类,一端连接到手机端口,开放数据线另一端的usb接口,对应适配器模式中的Adapter。

 1 package com.crazysnail.adapter;
 2
 3 public class UsbDataLine extends UsbPort{
 4     private PhonePort phonePort;
 5
 6     public UsbDataLine() {
 7         System.out.println("获取一条匹配特性型号手机的数据线");
 8         phonePort = new PhonePort();
 9     }
10
11     @Override
12     public void getUsbPort(){
13         phonePort.getPhonePort();
14         System.out.println("手机接口连接到数据线一端,开放数据线的usb接口一端");
15     }
16 }

  人类类,有连接手机到电脑的需求,使用数据线将手机连接到电脑,对应适配器模式中的Client。

1 package com.crazysnail.adapter;
2
3 public class Human {
4     public static void linkPhoneToComputer(UsbDataLine line){
5         line.getUsbPort();
6         System.out.println("将Usb接口连接到电脑");
7     }
8 }

  测试类,效果演示。

1 package com.crazysnail.adapter;
2
3 public class AdapterTest {
4     public static void main(String[] args){
5         UsbDataLine newUsbDataLine = new UsbDataLine();
6
7         Human.linkPhoneToComputer(newUsbDataLine);
8     }
9 }

  效果图:

7、适配器模式的特点

  • 实现了类的复用,利用了原有的Adaptee类,通过Adapter接口的包装或改造,满足了新需求。
  • 当需要冲定义Adaptee类时,可能会影响到Adapter中的操作。
时间: 2024-10-13 23:57:48

结构型—适配器模式的相关文章

设计模式之结构型-适配器模式(Adapter)

(一)定义:将一个接口转换成为客户想要的另一个接口,适配器模式使接口不兼容的那些类可以一起工作. 1.1  UML类图 1.2  类与对象之间关系 Target:目录抽象类,定义客户要用的特定领域的接口 Adapter:适配器(公共接口),调用另一个接口,作为一个转换器 Adaptee:适配器(母接口),定义一个接口,Adapter需要接入. Client:客户调用类. 1.3  典型调用顺序图 适配器定义-源码public class Target { public virtual strin

设计模式06: Adapter 适配器模式(结构型模式)

Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象不能满足的.如何应对这种“迁移的变化”?如何既能够利用现有对象的良好表现,同时又能满足新的应用环境所要求的接口? 意图(Intent)将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一

一起学java设计模式--适配器模式(结构型模式)

适配器模式 现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法.现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中.绘制类图并编程实现. (要求实现

跟着实例学习设计模式(8)-适配器模式adapter(结构型)

适配器模式属于结构型设计模式 设计意图:将一个类的接口转换成客户希望的另外一个接口.A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 该模式正如名字一样适配器,就是为了能使之前的老接口可以焕发青春的模式,使用一个新的接口把已经存在的接口发布出去. 这样的设计模式,我们一版在企业信息化升级时会经常使用,有些企业存在的老接口经常不能对外接收数据,而重构又成本太高,那就只能使用适配器模式了,将老接口重新包装发布. 当然也有设计时就会使用的时候,大家可能不相信,不

设计模式(七) : 结构型模式--适配器模式

适配器模式主要是为了解决接口不符合系统需要的问题.分成类的适配器和对象的适配器. 1. 类的适配器: 示意性代码: package com.javadesignpattern.Adapter; public interface Target { public void sampleOperation1(); public void sampleOperation2(); } package com.javadesignpattern.Adapter; public class Adaptee {

Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别

本文介绍7种结构型模式里的剩下两种:享元模式.代理模式. 一.享元模式FlyWeight 享元模式比较简单且重要,在很多场合都被用到,只不过封装起来了用户看不到.其概念:运用共享内存技术最大限度的支持大量细粒度的对象.这个概念给的有些抽象,说白了就是如果内存中存在某个对象A,如果再次需要使用对象A的时候如果内存中有A这个对象就直接使用它,不要再次new了.如果没有,则重新new一个.基于这个特点,享元模式使用时一般会给待访问对象传递一个Tag,用来标识这个对象,而且要同时使用抽象工厂的方法进行访

设计模式(七):Adapter 适配器模式 -- 结构型模式

1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器.可以使用这个电源适配器充电.这个iphone的电源适配器就是类似我们说的适配器模式.(电源适配器就是把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西.)  例子2:最典型的例

java-设计模式(结构型)-【适配器模式】

1.适配器(Adapter Mode) 定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adapter(适配器)两个身份 目的是消除由于接口不匹配所造成的类的兼容性问题. 我们经常碰到需要将两个没有关系的类组合在一起使用,第一种方法是,修改各自的接口,但是违背了开闭原则 第二种方法是,使用Adapter,在两种接口之间创建一个混合接口(混血儿). 分类:类的适配器模式.对象的适配器模式.接口的适配器模式 1.1 类的适配器模式

NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式. 意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可