设计模式(八):适配器模式

一、概述

  适配器模式将一个类的接口,转换为客户期望的另一个接口。适配器让原本不兼容的类可以合作无间

二、解决问题

  从模式的定义中,我们看到适配器模式就是用来转换接口,解决不兼容问题的。想想我们现实生活中的适配器,最常用的就是手机充电器了,也叫做电源适配器,它把家用交流强电转换为手机用的直流弱电。其中交流电就是被适配者,充电器是适配器,手机是用电客户。

三、结构类图

  

四、成员角色

  客户(Client):只能调用目标接口功能,不能直接使用被适配器,但可以通过适配器的接口转换间接使用被适配器。

  目标接口(Target):客户看到的接口,适配器必须实现该接口才能被客户使用。

  适配器(Adapter):适配器把被适配者接口转换为目标接口,提供给客户使用。

  被适配者(Adaptee):被适配者接口与目标接口不兼容,需要适配器转换成目标接口子类,才能被客户使用。

五、应用实例

  下面用鸟叫和鸟飞的例子解析适配器模式,鹦鹉会叫也会飞,但鹅就只会叫不会飞,而且鹅也不是鸟类,我们要创建一个适配器,把鹅转换成鸟。

  第一步、创建鸟接口,对应角色目标接口

package adapter.pattern;

//鸟接口
public interface Bird {
	//鸟叫
	public void chirp();
	//飞
	public void fly();
}

  第二步、创建鹦鹉类

package adapter.pattern;

//鹦鹉类实现鸟接口
public class Parrot implements Bird{

	public void chirp() {
		System.out.println("呜呜呜");
	}

	public void fly() {
		System.out.println("我能飞很远很远");
	}

}

  第三步、创建鹅类,对应角色被适配者

package adapter.pattern;

//鹅类,不是鸟
public class Goose {
	//鹅会叫但不会飞,没有飞的方法
	public void chirp(){
		System.out.println("嘎嘎嘎");
	}
}

  第四步、创建适配器

package adapter.pattern;

//适配器,把鹅类适配为鸟
public class GooseAdapter implements Bird{
	//组合鹅类
	Goose goose;
	public GooseAdapter(Goose goose){
		this.goose = goose;
	}

	public void chirp() {
		if(goose != null){
			//调用鸟叫的时候委托鹅叫
			goose.chirp();
		}
	}

	public void fly() {
		//不支持该操作,可以抛出该异常,客户可以知道详情
		throw new UnsupportedOperationException();
	}

}

  第五步、测试适配器

package adapter.pattern;

public class AdapterTest {
	public static void main(String[] args){
		System.out.println("-----鹦鹉会叫也会飞-----");
		Bird parrot = new Parrot();
		parrot.chirp();
		parrot.fly();

		System.out.println("-----鹅会叫但不会飞-----");
		Goose goose = new Goose();
		Bird gooseAdapter = new GooseAdapter(goose);
		gooseAdapter.chirp();
		gooseAdapter.fly();

	}
}

  运行结果:

  适配器在java中的例子,我们知道ArrayList类实现了迭代器(Iterator),但不支持枚举(Enumeration),下面我们就来实现ArrayList的枚举操作。

package adapter.pattern;

import java.util.ArrayList;
import java.util.Enumeration;

public class ItertorEnumeration implements Enumeration{
	//组合被适配者
	private ArrayList<String> list;
	//集合的计数器,判断指针指向集合的位置
	private int index = 0;
	public ItertorEnumeration(ArrayList<String> list){
		this.list = list;
	}
	public boolean hasMoreElements() {
		if(list != null && list.size() > index){
			return true;
		}
		return false;
	}

	public Object nextElement() {
		String content = list.get(index);
		index++;
		return content;
	}
}

  

六、优点和缺点

  1、优点

  (1)、转换接口,适配器让不兼容的接口变成兼容。

  (2)、让客户和实现的接口解耦。有了适配器,客户端每次调用不兼容的接口时,不用修改自己的代码,只要调用适合的适配器就可以了。

  (3)、使用了对象组合设计原则。以组合的方式包装被适配者,被适配者的任何子类都可以搭配着同一个适配器使用。

  (4)、体现了“开闭”原则。适配器模式把客户和接口绑定起来,而不是和具体实现绑定,我们可以使用多个配适器来转换多个后台类,也可以很容易地增加新的适配器。

  2、缺点

  (1)、每个被适配者都需要一个适配器,当适配器过多时会增加系统复杂度,降低运行时的性能。

  (2)、实现一个适配器可能需要下一番功夫,增加开发的难度。

七、使用场景

  1、当要使用的两个类所做的事情相同或者相似,但是具有不同的接口时考虑使用配适器模式。

  2、当需要统一客户端调用接口的代码,而所调用的接口具有不兼容问题时使用适配器模式。这样客户端只有调用一个接口就行了,这样可以更简单、更直接、更紧凑。

八、总结

  1、适配器有对象适配器和类适配器,类适配器需要用到多重继承。

  2、适配器就是转换接口达到我们的需要。

时间: 2024-10-10 19:32:28

设计模式(八):适配器模式的相关文章

设计模式八 适配器模式

0.基本定义 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 通俗的讲,在不改变老系统的功能接口情况下,作向下兼容. spring中以Adapter结尾的都是. 1.实例代码(类间继承) 功能:对原来对账号密码登入方式,添加第三方登入. 老接口: public class SiginService { pu

设计模式之适配器模式

适配器模式(Adapter Pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类别自己的接口包裹在一个已存在的类中. Adapter Pattern有两种: 类的Adapter Pattern(继承) 对象的Adapter Pattern(委托) 下面我们用第一种来实现适配器模式: 我们首先来看看类图: 具体实现如下: Banner类: public class Banner { private Stri

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

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

大话设计模式_适配器模式(Java代码)

适配器模式:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 简单描述: 大话设计模式中的截图: 代码例子: AbstractPlayer类: 1 package com.longsheng.adapter; 2 3 public abstract class AbstractPlayer { 4 5 public abstract void attack(); 6 7 public abstract void defenc

螃蟹学PHP设计模式之适配器模式

之前对java的设计模式略有了解,但是螃蟹目前是靠PHP吃饭,所以对于进阶学习php设计模式还是很有必要.螃蟹虽然做开发两年了,但是在老鸟眼中还是菜鸟,为了自己写的代码更容易维护和进行团队协作,所以我要搞定设计模式.希望螃蟹今年能创业成功或找个好工作. 1.适配器模式 螃蟹的理解是你买了港行的iphone手机,发现自家的插座和手机自带的插头不配,怎么办呢,就需要一个转换器(适配器).可能原来系统的类不是你设计的,但是现在你要使用原来的类,发现有问题,但原来的类又不能动,或者不需要动,这样你写一个

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

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

Head First 设计模式之适配器模式与外观模式

Head First设计模式之适配器模式与外观模式 前言: 之前讲过装饰者模式,将对象包装起来并赋予新的职责,这一章我们也会将对象进行包装,只不过是让它们看起来不像自己而像是别的东西.这样就可以在设计中将类的接口转化为想要的接口,以实现同的接口,此外还将讲述另一个模式,将对象包装起来以简化接口. 1.   适配器简介 1.1 面向对象的适配器 真实世界的适配器比如位于美式插头和欧式插座之间的交流电适配器.面向对象的适配器是什么呢? 面向对象的适配器是将一个接口转化成另一个接口,以符合客户的期望.

每天一个设计模式-3 适配器模式(Adapteer)

每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来了“适配器”. 2.联系编程 有一个电源类,一个旧的硬盘类,还有一个新硬盘类:电源类能直接适配旧硬盘类,但不能和新硬盘适配. 这时,可以添加一个适配器类,这里采用对象引用的方式实现适配器. 3.类图 模式简图: 测试时使用的类图: 4.代码 NewDiskApi: public interface

Java编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口.为取得此效果,需要在新类中嵌入一个现有类的private对象.但有时,允许类的用户直接访问新类中的组合成分是极具意义的,即将成员对象声明为public.如果成员对象自身都隐藏了具体实现,那么这种做法是安全的.当用户能够了

JAVA学习笔记--策略设计模式与适配器模式

一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而"策略"包含变化的部分.策略就是传递进去的参数对象,它包含要执行的代码. 这种设计模式将算法分别独立封装起来,然后将其当做参数传递给方法从而让方法产生不同的行为,不同的算法可以进行替换(就像给方法不同的实参).我们可以知道,在策略设计模式中有三个部分:策略.策略引用.接收策略引用的方法(这是笔者自己根据理解给出的名词,并没有查询有没有这些术语).下面通