在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。
通俗来讲,适配器就是一个中转站,把A模型转换为B模型。
适配器模式的定义与特点:
定义如下:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,类结构型模式类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
该模式的主要优点如下。
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
其缺点是:
对类适配器来说,更换适配器的实现过程比较复杂。
模式的结构与实现:
对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。现在来介绍它们的基本结构。
1、模式的结构:
适配器模式(Adapter)包含以下主要角色:
-
目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
-
适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
-
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
2、模式的具体实现:
A、目标(Target)接口:
public interface UserInfoInter {
String getUserName();//获得用户姓名
String getHomeAddress();//获得家庭地址
String getMobileNumber();//手机号码,这个太重要,手机泛滥呀
String getOfficeTelNumber();//办公电话,一般式座机
String getJobPosition();//这个人的职位是啥
String getHomeTelNumber();//获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作
}
B、适配者(Adaptee)接口(这个不是必须的,但最好是存在)
public interface OuterUserInter {
Map<String, String> getUserBaseInfo();//基本信息,比如名称,性别,手机号码了等
Map<String, String> getUserOfficeInfo();//工作区域信息
Map<String, String> getUserHomeInfo();//用户的家庭信息
}
C、 适配者(Adaptee)类
public class OuterUser implements OuterUserInter{
@Override
public Map getUserBaseInfo() {
HashMap<String, String> baseInfoMap = new HashMap();
baseInfoMap.put("userName", "这个员工叫混世魔王...."); baseInfoMap.put("mobileNumber", "这个员工电话是....");
return baseInfoMap;
}
@Override
public Map getUserOfficeInfo() {
HashMap<String, String> officeInfo = new HashMap();
officeInfo.put("jobPosition","这个人的职位是BOSS..."); officeInfo.put("officeTelNumber", "员工的办公电话是....");
return officeInfo;
}
@Override
public Map getUserHomeInfo() {
HashMap<String, String> homeInfo = new HashMap();
homeInfo.put("homeTelNumbner", "员工的家庭电话是...."); homeInfo.put("homeAddress", "员工的家庭地址是....");
return homeInfo;
}
}
D、适配器(Adapter)类
public class OuterUserInfo extends OuterUser implements UserInfoInter {
private Map<String, String> baseInfo; //员工的基本信息
private Map<String, String> homeInfo; //员工的家庭 信息
private Map<String, String> officeInfo; //工作信息
public OuterUserInfo(){
baseInfo = super.getUserBaseInfo(); //员工的基本信息
homeInfo = super.getUserHomeInfo(); //员工的家庭 信息
officeInfo = super.getUserOfficeInfo(); //工作信息
}
@Override
public String getUserName() {
String userName = baseInfo.get("userName"); return userName;
}
@Override
public String getHomeAddress() {
String homeAddress =homeInfo.get("homeAddress"); return homeAddress;
}
@Override
public String getMobileNumber() {
String mobileNumber = baseInfo.get("mobileNumber"); return mobileNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = officeInfo.get("officeTelNumber"); return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = officeInfo.get("jobPosition"); return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = homeInfo.get("homeTelNumber"); return homeTelNumber;
}
}
E、客户端调用:
public class AdapaterPattern {
public static void main(String[] args) {
UserInfoInter userInfoInter = new OuterUserInfo();
UserInfoBean userInfoBean = new UserInfoBean(userInfoInter.getUserName(), userInfoInter.getHomeAddress(),
userInfoInter.getMobileNumber(), userInfoInter.getOfficeTelNumber(),
userInfoInter.getJobPosition(),userInfoInter.getHomeTelNumber());
System.out.println("AdapaterPattern.main:漂亮妹妹的信息--->>>" + userInfoBean.toString());
}
}
F、用户信息Bean文件
public class UserInfoBean {
private String userName, homeAddress, mobileNumbe, officeTelNumber, jobPositio, homeTelNumber;
public UserInfoBean(String userName, String homeAddress, String mobileNumbe,
String officeTelNumber, String jobPositio, String homeTelNumber) {
this.userName = userName; this.homeAddress = homeAddress;
this.mobileNumbe = mobileNumbe; this.officeTelNumber = officeTelNumber;
this.jobPositio = jobPositio; this.homeTelNumber = homeTelNumber;
}
@Override
public String toString() {
return "UserInfoBean{" +
"userName='" + userName + '\'' + ", homeAddress='" + homeAddress + '\'' +
", mobileNumbe='" + mobileNumbe + '\'' + ", officeTelNumber='" + officeTelNumber + '\'' +
", jobPositio='" + jobPositio + '\'' + ", homeTelNumber='" + homeTelNumber + '\'' + '}';
}
}