java语言实现结构型设计模式—适配器模式

一、描述

适配器模式就是讲一个系统的接口转换成另外一种形式,从而使原来不能直接调用的接口变得可以调用。例如我现在有一份List类型的用户名单,但是我的系统需要一份Map类型的用户名单,所以我就需要写一个继承Map类的适配器,将List类型的名单适配成Map类型的名单从而可以直接在系统只使用。

当系统需要使用一个外部的接口,而这个外部接口不满足系统需要的时候,我们需要使用适配器模式对外部接口进行封装转换为系统可以使用的类型。适配器类分为对象适配器和类适配器两种,其中对象适配器,即实现目标类的接口,依赖适配者类;而对于类适配器来说,要直接继承适配者类,并实现目标类的接口。

适配器模式主要由3部分组成:目标类、源类和适配器类。在这里目标类就是你的系统所需要的类型,而源类是指你现在拥有的但是不适合你的系统的类型,适配器类则是用于将源类转换为目标类的转换类,例如在java的I/O中,存在将字节流和字符流进行转换的适配器InputStreamReader和OutputStreamWriter,这两个类分别负责将输入字节流转换为字符流和将输出字节流转换为字符流。

二、适配器类的优缺点

优点:在系统中使用适配器模式,可以将一个系统的接口和本来不相容的另一个系统的类联系起来,在双方之间搭建一个桥梁,从而使得这两个类通过这个适配器类可以平缓过渡和融合,强调了对接口的转换。

缺点:对于类适配器来说,不能适配一个类以及它的子类;对于对象适配器来说,重新定义被适配的类的行为比较困难。因为类适配器继承了 Adaptee (被适配类),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。对象适配器不使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式,被适配器类是适配器类的成员变量。

三、源代码

1、源类:

package tong.day5_4.adapter;

import java.util.ArrayList;
import java.util.List;

/**
 * 源类:返回一个List类型的内部人员列表,但是系统需要的是map类型的列表,所以需要适配器类进行转换
 * @author tong
 *
 */
public class UniformFacade {
	//获取一个List类型的人员列表
	public List<Person> getPersonList() {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("张三", 35));
		personList.add(new Person("李四", 30));
		personList.add(new Person("王五", 25));
		personList.add(new Person("赵六", 29));
		return personList;
	}
}

class Person {
	private String name;
	private int age;

	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	//重写toString(),打印输出person对象时按照如下格式输出
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}	

}

2、目标类

package tong.day5_4.adapter;

import java.util.HashMap;
/**
 * 目标类:这是系统需要的类型,系统将使用这个类进行数据的输出
 * @author tong
 *
 */
class ManageMap {
	public static void execute(HashMap map) {
		for (int i = 0; i < map.size(); i++) {
			System.out.println(map.get(i));
		}

	}

}

3、适配器类

package tong.day5_4.adapter;
import java.util.HashMap;
import java.util.List;

/**
 * 适配器类:将List类型的人员表转换为Map类型的人员表
 * @author tong
 *
 */
public class MapAdapter extends HashMap{
	private List list;

	public MapAdapter(List list) {
		this.list = list;
	}

	public int size() {
		return list.size();
	}
	public Object get(Object object) {
		return list.get(new Integer(object.toString()).intValue());
	}
}

4、客户端调用类

package tong.day5_4.adapter;
//客户端测视类
public class Client {

	public static void main(String[] args) {
		//创建源类,获取源类产生的结果
		UniformFacade uniformFacade = new UniformFacade();
		//将源类的结果作为参数传递到适配器类中,并创建适配器对象
		MapAdapter mapAdapter = new MapAdapter(uniformFacade.getPersonList());
		//将适配器对象作为目标类的方法的参数,在目标类中使用适配器类的转换效果
		ManageMap.execute(mapAdapter);

	}

}

运行结果:

时间: 2024-10-06 00:29:36

java语言实现结构型设计模式—适配器模式的相关文章

java语言实现结构型设计模式—外观模式

一.描述 外观模式又叫门面模式,就是对一个复杂的系统进行包装,该系统对外的接口统一由外观类提供.当一个复杂的系统需要对外提供接口时,就需要将对外提供的接口统一封装在一个外观类中供外系统使用.外观模式最大的特点就是将细粒度的对象包装成粗粒度的对象,应用程序通过访问这个外观对象来完成细粒度对象的调用.这样应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. 总的来说,外观模式就是为子系统对外提供的一组接口,这组接口提供一个统一的界面,使得其它

结构型设计模式-适配器模式

适配器模式角色 Target 目标抽象类 Adapter 适配器类 Adaptee 适配者类 Client 客户类 适配器模式是一种包装的模式,和外观模式一样都具有包装的功能,对象适配模式还有些委托的意思.总的来说,适配器模式是一个补偿模式,专门用于项目后期的扩展.修改时使用,不要过多的使用适配器模式.(使用过多会使系统看起来很乱.) 类图 时序图

&quot;围观&quot;设计模式(30)--结构型设计模式总结(适配器、代理、装饰、外观、桥梁、组合、享元)

设计模式代码下载地址 设计模式代码下载地址 1  适配器模式 在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对

结构型设计模式对比 设计模式(十六)

结构型设计模式 结构型模式关注于整体最终的结构,通过继承和组合,构建出更加复杂的结构 进而提供更加强大的逻辑功能 七种结构型模式 适配器模式(Adapter Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 代理模式(Proxy Pattern) 桥接模式(Bridge Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 所有的结构型设计模式在逻辑上都各自不同程度的隐含了“间

结构型模式—适配器模式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而

&quot;围观&quot;设计模式(11)--结构型之适配器模式(Adapter Pattern)

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper).将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中.----WIKIPEDIA 个人理解 适配器模式:将两个不一致或者说无法直接使用的类或者接口通过适配器模式进行兼容,使得他们可以在一块使用.适配器模式在之前的项目中我是用于处理数据的不兼容的,对方的数据和我们的数据格式不完全一致,包括,类型的不一致和内容的

结构型设计模式 之 适配器模式

一.介绍 我们看一下<研磨设计模式>中的定义: 将一个类的接口转换成客户希望的另一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式的本质是——转换匹配,复用功能. 怎么理解呢?就是说,新的接口需要实现的功能,旧的接口现在都有,问题是,怎么把旧的接口的实现类拿去实现新的接口. 方法很简单,那就是把旧接口的实现类放到适配器中,可以作为成员变量,也可以作为局部变量,只要能使用都可以.然后适配器实现新的接口,在适配器@Overide的方法中,调用旧接口的实现类去

结构型设计模式之适配器模式

结构 意图 将一个类的接口转换成客户希望的另外一个接口.A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用性 你想使用一个已经存在的类,而它的接口不符合你的需求. 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作. (仅适用于对象A d a p t e r )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口.对象适配器可以适配它的父类接口. 1 using System

《精通Python设计模式》学习结构型之适配器模式

大名鼎鼎~~ 在兼容老系统和其它系统外调用时,用得着~ class Synthesizer: def __init__(self, name): self.name = name def __str__(self): return 'the {} synthesizer'.format(self.name) def play(self): return 'is playing an electronic song' class Human: def __init__(self, name): s