Adapter Design Pattern(适配器模式)

适配器模式在软件开发中其实是一个极其常见的模式,该模式的功能是使两个并不兼容的接口能够共同工作。很多时候我们都在有意无意的使用这个模式。

因为两个接口并不能兼容,所以适配器的任务就是对数据或者对象进行适配,让调用接口能够使用另一接口产生的结果。其中进行适配工作的对象,就是适配器。

很多设计模式教科书都喜欢用读卡器进行举例:手机用户常用的tf卡是不能插到电脑上工作的,而是需要插在读卡器上,然后接驳到电脑的USB端口上,这样就能进行数据处理工作了;同样的例子还有电源的转换器,美国的电压一般是110V,而中国大陆是220V,如果将美国标准的电器直接插到大陆的插座上使用,势必要出现电压过高被烧毁的结果,这时候就需要一个电压的转换器,将220V的电压转换为110V进行使用。这些,都是适配模式以及适配器的例子。

本文以一个简单的例子进行举例,目前有一个能产生用户列表的方法,有三个打印用户信息的方法希望能调用这个接口,但是这三个方法均不能接受列表格式的数据,则需要一个适配器将数据类型进行适配之后,传递给这个方法使用,代码如下:

package dp.adapter;

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

public class UsersManager{
	/*
	 * 该方法只能生成用户名的列表,这样的数据结构不能被另外三个方法接受(这三个调用方法分别需要,数组,Vector,用竖线分割的字符串)
	 */
	public List<String> getUsersNamesList(){
		List<String> usersNamesList = new ArrayList<String>();
		usersNamesList.add("Jerry");
		usersNamesList.add("Rich");
		usersNamesList.add("John");
		usersNamesList.add("Paul");
		usersNamesList.add("Mark");
		usersNamesList.add("Tom");
		return usersNamesList;
	}
}
package dp.adapter;

import java.util.Vector;

/*
 * 适配器接口
 */
public interface UsersManagerAdapter{
	public String[] getUsersNamesArray();
	public Vector<String> getUsersNamesVector();
	public String getUsersNamesSeperatedbyLine();
}
package dp.adapter;

import java.util.List;
import java.util.Vector;

/*
 * 适配器能够为调用者适配出合适的数据结构
 */
public class UsersManagerAdapterImpl implements UsersManagerAdapter {

	UsersManager usersManager = new UsersManager();

	@Override
	public String[] getUsersNamesArray() {
		List<String> list = usersManager.getUsersNamesList();
		String names[] = null;
		if(list!=null && list.size()>0){
			names = new String[list.size()];
			for( int i=0;i<list.size();i++){
				names[i] = list.get(i);
			}
		}
		return names;
	}

	@Override
	public Vector<String> getUsersNamesVector() {
		Vector<String> usersVector = new Vector<>();
		List<String> list = usersManager.getUsersNamesList();
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				usersVector.add(list.get(i));
			}
		}
		return usersVector;
	}

	@Override
	public String getUsersNamesSeperatedbyLine() {
		List<String> list = usersManager.getUsersNamesList();
		StringBuffer usersNamesString = new StringBuffer();
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				usersNamesString.append(list.get(i)).append("|");
			}
		}
		return usersNamesString.toString();
	}

}
package dp.adapter;

import java.util.Vector;

public class Main {

	public static void main(String args[]) {
		UsersManagerAdapter usersManagerAdapter = new UsersManagerAdapterImpl();

		Main main = new Main();
		System.out.println("-----------------------");
		main.usersNamesArrayPrinter(usersManagerAdapter.getUsersNamesArray());
		System.out.println("-----------------------");
		main.usersVectorPrinter(usersManagerAdapter.getUsersNamesVector());
		System.out.println("-----------------------");
		main.usersStringPrinter(usersManagerAdapter.getUsersNamesSeperatedbyLine());

	}

	public void usersNamesArrayPrinter(String namesArrays[]) {
		if (namesArrays != null) {
			for (int i = 0; i < namesArrays.length; i++) {
				System.out.println(namesArrays[i]);
			}
		}
	}

	public void usersVectorPrinter(Vector<String> namesVector) {
		if (namesVector != null) {
			for (int i = 0; i < namesVector.size(); i++) {
				System.out.println(namesVector.get(i));
			}
		}
	}

	public void usersStringPrinter(String usersNames) {
		if (usersNames != null) {
			System.out.println(usersNames);
		}
	}
}

运行结果:

-----------------------
Jerry
Rich
John
Paul
Mark
Tom
-----------------------
Jerry
Rich
John
Paul
Mark
Tom
-----------------------
Jerry|Rich|John|Paul|Mark|Tom|

从运行结果可见,三个方法能够调用适配器转换过来的数据然后进行正常的打印。

总结:适配器模式在日常开发尤其是代码重构过程中非常常见,很多时候我们都有意无意的在使用该模式,毕竟很多旧的接口和方法返回的数据并不能适应新的接口调用,尝尝需要对数据进行适配。

时间: 2024-10-05 07:58:16

Adapter Design Pattern(适配器模式)的相关文章

java design pattern - adapter pattern

场景 适配器模式 总结 参考资料 场景 在编程中我们经常会遇到驴头不对马嘴的情况,比如以前是继承A的接口的对象,现在外部调用的时候需要该对象已B接口的形式来调用 ,这个时候我们可以让对象同时集成A和B接口来达到目的,不过,这样又违反了开闭原则,这个时候我们可以使用适配器模式来达到目的. 适配器模式 适配器模式是一种结构模式,可以帮助我们把对象以不同的接口方式来调用.主要由3个角色组成: Target 外部调用要求的接口方式 Adapter 中间用来协调的适配器 Adaptee 原始对象 首先,我

设计模式(Design pattern)概述

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结, 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 设计框架 可复用面向对象软件系统一般划分为两大类:应用程序工具箱和框架(Framework) 我们平时开发的具体软件都是应用程序 而框架是构成一类特定软件可复用设计的一组相互协作的类 框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节. 框架主要记录软件应用中

简单工厂设计模式(Simple Factory Design Pattern)

[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适

C++ Design Pattern: What is a Design Pattern?

Q: What is a Design Pattern? A: Design Patterns represent solutions to problems what arise when developing software within a particular context. Each pattern describes a problem which occurs over and over again in our environment, and then describes

golang and design pattern

学习java的时候,“设计模式”这个概念到处可见.比如java.io里面的 decorated pattern,Object.Clone(Object)原生态支持Prototype pattern,Swing事件响应的Observer pattern, io.util和Event中的Adapter pattern.还有第三方框架中形形色色的design pattern.有时候从代码中突然发现一个design pattern,喜不自禁. 现在学习go语言,就再也没有从go语言中听到design p

DP什么意思 design pattern 设计模式

DP  design pattern 大话设计模式  中的DP 是设计模式的意思 设计模式的书 ,最经典最原始的就是 GOF 的<设计模式>了. 设计模式的书基本上大多是以这 20 多个模式分开讲.含<大话设计模式> 学了 OOL 写的程序基本上是 OB 的. 只有慢慢掌握了 DP 才能写出真正的 OO 程序. 思想 -> 设计原则 -> DP -> OOD

Head First Design Pattern 读书笔记(2) 观察者模式

Head First Design Pattern 读书笔记(2) Observer Pattern 观察者模式 Observer Pattern 类图 定义 观察者模式:在对象间定义一个一对多的关系,当其中一个的对象发生改变时,所有依赖于这个对象的对象(即观察者们)都会自动更新或做执行某些行为. 几个OO的原测 尽量以松耦合的方式处理对象间关系–>软件工程时候学的"高內聚,低耦合"的好处 关于观察者模式 被观察对象通知观察者可以使用推送的方式(类图中带参数的notifyActi

Design Pattern Singleton 单一模式

单一模式的几个注意点: 一) 设计单一模式,首先需要把构造函数给私有化了,不让外界访问,那么外界只能通过提供的函数获取一个新的类. 二) C++的单一模式,记得要在类外初始化一个类,否则或内存出错的. 三) 这个唯一的类必须是要静态的 程序: #ifndef _SINGLETON_H #define _SINGLETON_H #include <iostream> #include <string> using namespace std; class DuGuJiuJian {

Design Pattern 设计模式1 - Strategy 1

实现 : Defferent Heros attack Defferently. - 不同的英雄使用不用的招数 Strategy设计的思路: 基类A,更加小的基类B,新的继承类C: 1 从基类A中抽出一个更加小的基类B 2 利用这个更加小的基类B实现不同的效果 3 把这个更加小的基类B包含进基类A中去 4 新的继承类C只需要和基类A打交道,设计不同行为,不需要理会更加小的基类B #pragma once #ifndef _STRATEGY_HEROS_H #define _STRATEGY_HE