适配器模式

原创 2012年03月28日 11:10:00

实例场景:我们以前的电脑上键盘的usb接口有的是圆形的,现在假如这个接口坏了,用户想要更换一个,但市场上基本上是方形usb接口,很无赖,配不上号,这时,店主告诉用户不用担心,买一个转换器就行,转换器可以兼容圆形和方形接口,问题就解决了。这个场景用到了我们所说的:适配器模式

Adapter模式的定义把一个类的接口变换成客户端所期待的另外一种接口,使得原本由于接口不兼容而不能再一起工作的那些类可以一起工作。

适配器模式分类1.类的适配器模式(采用继承实现)2.对象适配器(采用对象组合方式实现)

模式的构成以问题中例子为模型

目标抽象角色(Target):定义客户所期待要使用的接口,我们把键盘当做客户端,客户端所需要使用的usb接口是圆形的,在这里就可以抽象出来一个圆形接口的设备(并不一定是键盘)。

源角色(Adaptee):需要被适配的接口,在这里指的是方形usb接口键盘。

适配器角色(Adapter)用来把源接口转换成符合要求的目标接口的设备,在这里指的是我们的那个“转换器”。

客户端(Client)这里指的就是那个键盘。

代码详解:

package cn.com.pattern;

//目标抽象角色,用户需要的是有圆形的usb接口
public interface Target {
	public void provideCircleUsb();
}

package cn.com.pattern;
//源角色,这里是指提供方形的usb接口
public class Adaptee {
	public void provideSquareUsb(){
		System.out.println("我提供方形的USB接口");
	}
}

package cn.com.pattern;
//适配角色,这里指老板买给我们的那个转换器
public class Adapter extends Adaptee implements Target{
	@Override
	//转换器将圆形的接口转换为方形接口
	public void provideCircleUsb() {
		this.provideSquareUsb();
	}
}

package cn.com.pattern;

//客户端,也就是问题中的键盘
public class Client {
	public static void main(String[] args) {
		Target target=new Adapter();
		//键盘只能使用圆形的USB接口
		target.provideCircleUsb();
	}

}


最后将会输出:我提供方形的USB接口

达到了用户需要的效果,让只支持圆形USB接口的键盘使用方形USB接口

以上是类的适配器模式,对象的适配器模式的不同之处在于Adapter角色封装了Adaptee角色,而不像类的适配器模式所采取的继承方式。其原理基本上是相似的。

public class Adapter implements Target{
       private Adaptee adptee;
       public Adapter(Adaptee adptee){
          this.adptee=adptee;
          }
         
        @Override
	//转换器将圆形的接口转换为方形接口
	public void provideCircleUsb() {
		adptee.provideSquareUsb();
	}
}


类的适配器模式和对象适配器模式的比较

1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。

应用适配器模式的场景

1.系统需要使用现有的类,而现有类不符合当前系统的要求。如问题的提出。

2.系统要建立一个可以重复使用的类,用来与彼此没有太大关联的类或者在将来要引用的类一起工作。在Junit中有使用适配器模式的情景。

缺省的适配器模式(Default Adapter):缺省的适配器模式为一个接口提供缺省的实现,子类可以从这个缺省的实现类进行扩展,而不必而原有的接口进行扩展。相信大家在学习Swing时“AWT中事件的处理”有所接触。他的好处在于客户端不需要去实现与他无关的方法,只做他最关心的事。

这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用中默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。






JAVA适配器模式示例

将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1、目标:目标是一个接口,该接口是客户想使用的接口 ...
  • qq7342272
  • qq7342272
  • 2011年10月31日 14:02
  • 6197

设计模式——适配器模式 Java源代码

适配器模式,《Head First Design Patterns》给的代码的例子是关于鸭子和火鸡,然而鸭子和火鸡离日常生活比较远。这次,我改编了实验楼网站上面的例子,关于插座和充电器。...
  • u013390476
  • u013390476
  • 2016年01月01日 16:02
  • 2576

设计模式-适配器模式(Go语言描述)

在上一篇博客设计模式-策略模式(Go语言描述)中我们用最简单的代码用go语言描述了 设计模式中的策略模式,用最简单的实例来描述相信可以让初学者可以很轻松的掌握各种设计模式。继上篇博客,我们接着用同样...
  • qibin0506
  • qibin0506
  • 2016年01月28日 08:56
  • 6365

运用适配器模式应对项目中的变化

从上面可知随着项目的进行, 导致了接口的改变。但是我的前端工程中已经大量使用了ESPMenu对象, 大量调用了ESPMenu的方法,并且对ESPMenu的访问分散在不同的文件中。如果要把ESPMenu...
  • brave2211
  • brave2211
  • 2014年01月26日 13:25
  • 6140

一个示例让你明白适配器模式

本文讨论适配器模式。适配器模式是23中设计模式之一,它的主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。为了举这个例子,我还特意去京东上搜了一下电源转换器,确实看到了很多...
  • brave2211
  • brave2211
  • 2014年01月26日 00:08
  • 43263

JAVA设计模式初探之适配器模式

1. 概述   将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。 2. 解决的问题   即Adapter模式使得原本由于接口不...
  • jason0539
  • jason0539
  • 2014年03月29日 07:53
  • 45854

设计模式php实例:适配器模式

适配器模式将一个类的换成客户端需要的另一个接口,使原本不兼容的接口能一起工作。一个现实中的例子,假如屋里墙上只有两项插口,而风扇有三个插头,这时需要再拿一个移动插线板,插线板接入墙壁插口的一段是两项插...
  • wzllai
  • wzllai
  • 2012年08月05日 19:54
  • 3111

SpringMvc中使用到的适配器模式

此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:  Java...
  • bu123dian
  • bu123dian
  • 2016年10月10日 16:21
  • 2263

从SpringMVC来看适配器模式

适配器模式----------设计模式 最近在看SpringMVC源码,从中看到了比较优秀的设计模式所以来分享下。 1.适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,Ad...
  • u010288264
  • u010288264
  • 2016年12月23日 10:55
  • 2083

JDK与设计模式:适配器模式

1、适配器模式         适配器模式可以将一个类的接口和另一个类的接口匹配起来。适配器模式将一个接口转换为客户希望的另一个接口,使接口不兼容的哪些类可以一起工作,其别名是包装器。适配器模式既可...
  • Luckydog1991
  • Luckydog1991
  • 2016年06月18日 09:54
  • 1211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:适配器模式
举报原因:
原因补充:

(最多只允许输入30个字)