`
wangwengcn
  • 浏览: 175850 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

13.适配器模式(Adapter Pattern)

阅读更多

1.定义

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式又叫做变压器模式。

 

2.适配器模式的应用场景

适配器模式应用的场景只要记住一点就足够了:你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,怎么办?使用适配器模式。

 

日常生活中也是经常能见到这样的模式的,相信很多人都知道什么是显卡,也有很多人知道显卡的本名——图形适配器。我们知道显示器是用来显示图形的,它是不能显示数据,它只能够接受来自图形发送设备的信号。可是我们手头上只有CPU这个产生各种描述图形的数据的数据发送器。我们需要将这些数据让显示器进行显示,可是这两个部件却是不兼容的。于是我们需要一个 中间设备,它能够将CPU“适配”于显示器,这便是我们的显卡——图形适配器(Adapter)。


下面来看一个例子:
在我们日常开发中,经常要碰到和别的系统集成的问题。有时候两个系统中描述同一个事物的Class定义却不一样,
比如我自己系统中的User对象是这样定义的:

 

package _13AdapterPattern;

/**
 * 目标系统的用户接口
 */
public interface IUserInfo {

	public String getName();
	public String getCompanyAddress();
}
 
package _13AdapterPattern;

/**
 * 目标系统的用户实现类
 */
public class TargetUserInfo implements IUserInfo {

	@Override
	public String getName() {
		System.out.println("张三");
		return null;
	}

	@Override
	public String getCompanyAddress() {
		System.out.println("杭州");
		return null;
	}

}

 

而我要对接的第三方系统的用户设计是这样:

 

package _13AdapterPattern;

import java.util.HashMap;
import java.util.Map;

/**
 * 第三方系统的用户定义
 */
public class SourceUserInfo {

	private Map<String, String> userInfoMap = new HashMap<String, String>();

	public SourceUserInfo() 
	{
		userInfoMap.put("userName", "张三");
		userInfoMap.put("companyAddress", "杭州");
	}
	
	public String getUserInfo(String key)
	{
		return userInfoMap.get(key);
	}
}

 

这时候如果我调用第三方系统的webservice得到的用户对象在我们系统中将不能运行,因为我们定义的完全不同。

那么这时候该怎么办呢?

好吧,这个时候我想到去继承它们的用户类,并且实现自己的接口,这样在拿到它们数据的同时,还能改装成自己的用户类:

 

package _13AdapterPattern;

/**
 * 适配器类,将第三方的用户改装成自己的用户类
 */
public class AdapterUserInfo extends SourceUserInfo implements IUserInfo {

	@Override
	public String getName() {
		// 将他们的获取用户信息的API 封装到我们自己的API中实现适配器
		return this.getUserInfo("userName");
	}

	@Override
	public String getCompanyAddress() {
		// TODO Auto-generated method stub
		return this.getUserInfo("companyAddress");
	}

}

 

这个AdapterUserInfo就是一个简单实现的适配器。

 

3.适配器模式的三个角色

  • Target目标角色
  • Adaptee源角色
  • Adapter适配器角色

4.适配器模式的优点

  • 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定它们就行。
  • 增加了类的透明性:想想看,我们访问的目标角色,但是具体的实现都委托给了源角色,而这些对高层模块是透明的,也是它不需要关心的。
  • 提高了类的复用度:源角色在原有的系统中还是可以正常使用,而在目标角色中也可以充当新的演员。
  • 灵活性非常好:不想使用适配器的时候,只要删除适配器就行了,其他代码基本不用修改。

5.适配器模式的注意事项

适配器模式最好在详细设计阶段不要考虑它,它不是为了解决还在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式。这个模式的主要使用场景是扩展应用中。

 

6.适配器模式的扩展

适配器模式分为两种

  • 类型适配器:就是上面实现的那种,只要继承源类型,并实现目标接口就行了
  • 对象适配器:我们把上例子中的适配器重新实现以下,请看代码
package _13AdapterPattern;

/**
 * 对象适配器
 */
public class ObjectAdapterUserInfo implements IUserInfo {

	private SourceUserInfo sourceUserInfo;
	
	public ObjectAdapterUserInfo(SourceUserInfo sourceUserInfo)
	{
		this.sourceUserInfo = sourceUserInfo;
	}
	
	@Override
	public String getName() {
		return sourceUserInfo.getUserInfo("userName");
	}

	@Override
	public String getCompanyAddress() {
		return sourceUserInfo.getUserInfo("companyAddress");
	}

}

 

看出来了吧,没错,我们只是把适配器的继承关系改成了组合关系,不过基于“组合优于继承”的原则,大家懂的。

分享到:
评论

相关推荐

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

    适配器模式是软件设计模式中的一种,它的主要目的是解决接口不兼容问题,使得原本由于接口差异无法协同工作的类能够协同工作。在实际的软件开发过程中,我们常常遇到这样的情况:旧有的系统或第三方库提供了丰富的...

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

    适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户端期望的另一个接口。适配器模式常用于解决由于接口不兼容而无法正常工作的类之间的协作问题。 适配器模式的组成 目标接口(Target...

    通过java实现适配器模式(Adapter Pattern).rar

    在Java中,适配器模式(Adapter Pattern)通常用于使接口不兼容的类能够协同工作。它分为类适配器(通过继承实现)和对象适配器(通过组合实现)两种主要形式。然而,由于Java不支持多继承,类适配器通常通过实现一...

    设计模式 之 “适配器模式[Adapter Pattern]”

    适配器模式(Adapter Pattern)是软件设计模式中的一种,其主要目的是使两个不兼容的接口之间能够协同工作。在IT行业中,我们经常遇到不同系统、库或组件之间的接口不一致,导致它们无法直接交互。适配器模式就提供...

    通过C++实现适配器模式(Adapter Pattern).rar

    适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类一起工作。在C++中,适配器模式通常通过创建一个适配器类来实现,该类将不兼容的接口转换为兼容的接口。 压缩包文件代码是一个简单的C++...

    C#设计模式_设计模式_C#_

    适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式...

    23种设计模式 (创建型,结构型,行为型)

    适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. ...

    设计模式代码——c#

    6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12....

    Head First 设计模式 (七) 适配器模式(Adapter pattern) C++实现

    适配器模式(Adapter pattern)是软件设计模式中的一种,其主要目的是解决系统间接口不兼容的问题,使得原本无法直接协作的类或者组件能够协同工作。在“Head First 设计模式”这本书中,适配器模式被深入浅出地讲解...

    PHP设计模式(五)适配器模式Adapter实例详解【结构型】

    适配器模式(Adapter Pattern)是一种结构型设计模式,它主要解决的是接口不兼容的问题,使得原本由于接口差异无法一起工作的类能够协同工作。在PHP中,适配器模式通过创建一个包装类(适配器类)来转换不兼容的接口...

    适配器模式adapter,含源码下载

    适配器模式(Adapter Pattern)是一种结构型设计模式,它能将两个不兼容的接口连接在一起,使得原本由于接口不匹配而无法一起工作的类能够协同工作。在IT行业中,适配器模式广泛应用在系统集成、组件重用以及解决...

    适配器模式(Adapter Pattern)原理图

    适配器模式是一种结构型设计模式,它允许接口不兼容的两个类可以协同工作。以下是该模式的要点: 1. **角色**: - **Target(目标接口)**:客户端期望调用的接口。 - **Adaptee(适配者)**:现有的、接口与目标...

    java设计模式之适配器模式

    适配器模式(Adapter Pattern)是通过创建一个新的对象(适配器),这个对象将原本不兼容的对象接口转换为客户端期望的接口,从而使两者能够协同工作。适配器模式可以分为类适配器和对象适配器两种类型。 1. 类...

    32种设计模式

    适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight ...

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

    适配器模式(Adapter Pattern)是软件设计模式中的一种,其主要目的是解决系统中的接口不兼容问题,使得原本由于接口不匹配而无法一起工作的类能够协同工作。在本文中,我们将深入探讨适配器模式的概念、结构、作用...

    C#设计模式编程中运用适配器模式结构实战演练

    namespace DesignPatterns.AdapterPattern.Structural.ObjectAdapter{ public class Adaptee { public void SpecificRequest() { Console.WriteLine("Called SpecificRequest()"); } }}Adapter.cs:using System;...

    java设计模式;适配器模式(类)

    适配器模式(Adapter Pattern)是其中的一种,它允许两个不兼容的接口之间进行通信,通过创建一个适配器类来将原有接口转换成目标接口,使得原本不能一起工作的类可以协同工作。 适配器模式分为类适配器和对象...

    Java开发适配器模式详解

    适配器模式(Adapter Pattern)是一种常用的设计模式,其主要目的是让两个不兼容的接口能够协同工作。通过引入一个适配器,可以将现有类的接口转换成客户端期望的另一个接口,从而使原本由于接口不兼容而不能一起工作...

    设计模式实验报告-适配器模式.docx

    适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个类的接口变换成客户端所期待的另一种接口。通过这种方式,原本由于接口不兼容而无法一起工作的类可以顺利合作。适配器模式有两种实现方式:...

Global site tag (gtag.js) - Google Analytics