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

模式定义

适配器模式(Adapter Pattern):将一个接口转换成客户希望的接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

模式角色

适配器模式包括如下角色

  • Traget(目标抽象类)
  • Adapter(适配器类)
  • Adaptee(适配者类)
  • Client(客户类)

模式分析

适配器模式将目标类和适配者类解耦,引入一个适配器类来重用适配者类,具体的实现是在适配者类的,通过适配器模式,客户端类就不知道适配者类的具体实现了,

典型的类适配器代码:

public class Adapter extends Adaptee implements Target
{
	public void request()
	{
		specificRequest();
	}
}

典型的对象适配器代码:

public class Adapter extends Adaptee implements Target
{
	public void request()
	{
		specificRequest();
	}
}

模式例子

某系统需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法

本例子来自《设计模式》一书

目标类:

public abstract class DataOperation
{
	private String password;
	
	public void setPassword(String password)
	{
		this.password=password;
	}
		
	public String getPassword()
	{
		return this.password;
	}
	
	public abstract String doEncrypt(int key,String ps);
}

适配者类:

public final class Caesar 
{
	public String doEncrypt(int key,String ps)
	{   
		String es="";
		for(int i=0;i<ps.length();i++)
		{
			char c=ps.charAt(i);
			if(c>='a'&&c<='z')
			{
				c+=key%26;
			if(c>'z') c-=26;
			if(c<'a') c+=26;
			}
			if(c>='A'&&c<='Z')
			{
				c+=key%26;
			if(c>'Z') c-=26;
			if(c<'A') c+=26;
			}
			es+=c;
		}
		return es;
	}
}

适配器类:

public class CipherAdapter extends DataOperation
{
	private Caesar cipher;
	
	public CipherAdapter()
	{
		cipher=new Caesar();
	}
	
	public String doEncrypt(int key,String ps)
	{
		return cipher.doEncrypt(key,ps);
	}
}
public class NewCipherAdapter extends DataOperation
{
	private NewCipher cipher;
	
	public NewCipherAdapter()
	{
		cipher=new NewCipher();
	}
	
	public String doEncrypt(int key,String ps)
	{
		return cipher.doEncrypt(key,ps);
	}
}

模式分类

适配器模式可以分为默认适配器和双向适配器

默认适配器 在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。

双向适配器 如果在对象适配器中,在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么这个适配器就是一个双向适配器

模式应用

  • JDBC驱动软件都是一个介于jdbc接口和数据库引擎接口之间的适配器软件。JDBC驱动软件使java程序可以适配各种数据库引擎
  • Spring AOP框架中,对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型借助适配器模式来实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程微刊

mongoDB入门教程二:推荐一款好用的mongoDB可视化工具Robo 3T

MongoDB的环境搭建完成之后,连接上了数据库之后,这个时候对数据库的一些操作是枯燥无味的,需要一款辅助的工具,也就是可视化的工具,对于每一步操作都可以看见实...

29140
来自专栏itsoeasy

robotframework快速入门

一个类似于IDE的工具,它是由Python开发的, 使用的wxPython GUI包,所以要安装RIDE要首先安装wxPython. 在window上安装wxP...

59820
来自专栏编程微刊

mongoDB入门教程五:搭建一个简单的登陆注册界面

1:打开一个cmd窗口(右键以管理员身份)来运行mongo.exe。同样打开bin文件,执行mongo.exe

14440
来自专栏程序员同行者

Golang 对MongoDB的操作简单封装

每一次操作都copy一份 Session,避免每次创建Session,导致连接数量超过设置的最大值 获取文档对象c := Session.DB(db).C(c...

28320
来自专栏hotqin888的专栏

一个可以走流程的engineercms工程师知识管理系统

我们用于管理文件的系统,比如网盘云盘等,并不具备流程功能,所谓流程,本质是修改文档状态,比如,从初始状态,不同权限的人登录,查看这个文件,具有修改这个文档状态的...

13220
来自专栏杨飞@益术

android的四大主件

Android有四大组件:Activity、Service、Broadcast Receiver、ContentProvider。 Activity 做一个完...

8820
来自专栏编程微刊

mongoDB入门教程一:下载安装和环境配置、连接运行

MongoDB 是一个基于分布式文件存储的数据库, 是一个介于关系数据库和非关系数据库之间的产品。很久之前就已经学习过这个知识点,现在终于在工作之中用到,又重温...

14530
来自专栏编程微刊

Node.js新手在哪儿找小项目练手?

话不多说,任何一门技术从入门到熟悉,找项目来练手,着手做项目是一个必不可少的过程,找了很多项目进行参考,各种类型的源码看下来,就没有什么难倒你的了。

42620
来自专栏编程微刊

mongoDB入门教程三:数据库的创建和删除(增删改查)基本命令

2:必须插入一个数据。 数据库中不能直接插入数据,只能往集合(collections)中插入数据。

13020
来自专栏coding

php使用pecl安装mongodb扩展

默认情况下,php并没有安装mongodb扩展,会报Class 'MongoDB\Driver\Query' not found错误。

14510

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励