设计模式之适配器模式(结构型)
模式定义
适配器模式(Adapter Pattern):将一个接口转换成客户希望的接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
模式角色
适配器模式包括如下角色
- Traget(目标抽象类)
- Adapter(适配器类)
- Adaptee(适配者类)
- Client(客户类)
模式分析
适配器模式将目标类和适配者类解耦,引入一个适配器类来重用适配者类,具体的实现是在适配者类的,通过适配器模式,客户端类就不知道适配者类的具体实现了,
典型的类适配器代码:
public class Adapter extends Adaptee implements Target
{
public void request()
{
specificRequest();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
典型的对象适配器代码:
public class Adapter extends Adaptee implements Target
{
public void request()
{
specificRequest();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
模式例子
某系统需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法
本例子来自《设计模式》一书
目标类:
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);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
适配者类:
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
适配器类:
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
模式分类
适配器模式可以分为默认适配器和双向适配器
默认适配器
在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。
双向适配器
如果在对象适配器中,在适配器中同时包含对目标类和适配者类的引用,适配者可以通过它调用目标类中的方法,目标类也可以通过它调用适配者类中的方法,那么这个适配器就是一个双向适配器
模式应用
- JDBC驱动软件都是一个介于jdbc接口和数据库引擎接口之间的适配器软件。JDBC驱动软件使java程序可以适配各种数据库引擎
- Spring AOP框架中,对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型借助适配器模式来实现。
文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。
原文链接:smilenicky.blog.csdn.net/article/details/88412105
- 点赞
- 收藏
- 关注作者
评论(0)