之前学习过模板模式,最近又开始迷上了适配器模式,这个模式也很简单,我们笔记本上的那个拖在外面的黑盒子就是个适配器,一般我们在中国能用,在日本也能用,虽然两个国家的的电源电压不同(中国 220V,日本110V),但是这个适配器能够把这些不同的电压转换成我们需要的 36V 电压,保证我们的笔记本能够正常运行,那我们的23种设计模式中引入这个适配器模式和这个电源适配器有异曲同工之妙。我们下面看一个例子:两个不同的公司的人力资源系统使用的用户信息(UserInfo)对象不一样,但是如果哪天这两个公司合并了,那么他们的人才管理需要共享,这个时候使用适配器模式会有很大的好处。
图二
图一
甲公司有一个对象 UserInfo 存储用户的所有信息如上图一。 乙公司有一个对象 OutUserInfo(图二) 把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了 HashMap中,比如人员的姓名放到 BaseInfo 信息中,家庭地址放到 HomeInfo中。如果现在甲公司合并了乙公司,要让这两个系统交互,可以如下做:
可以新建一个类叫OutUserInfo来作为一个适配器,这个类实现甲公司现有的用户对象IUserInfo接口,继承乙公司用户对象OutUser,这样甲公司就可以和乙公司做人才交流了,下面请看代码实例:
甲公司的用户对象接口:IUserInfo
package com.licq.adapter;
public interface IUserInfo {
//获得用户姓名
public String getUserName();
//获得家庭地址
public String getHomeAddress();
//手机号码
public String getMobileNumber();
//办公电话
public String getOfficeTelNumber();
//个人的职位
public String getJobPosition();
//获得家庭电话
public String getHomeTelNumber();
}
甲公司的用户对象的实现类UserInfo:
package com.licq.adapter;
public class UserInfo implements IUserInfo {
public String getUserName() {
System.out.println("姓名叫做张三");
return null;
}
public String getHomeAddress() {
System.out.println("家庭地址在蛤蟆陵下住....");
return null;
}
public String getMobileNumber() {
System.out.println("手机号码是13838383838....");
return null;
}
public String getOfficeTelNumber() {
System.out.println("办公室电话是8888888....");
return null;
}
public String getJobPosition() {
System.out.println("职位是CEO....");
return null;
}
public String getHomeTelNumber() {
System.out.println("员工的家庭电话是...就不告诉你....");
return null;
}
}
乙公司的用户对象接口IOuterUser:
package com.licq.adapter;
import java.util.Map;
public interface IOuterUser {
//基本信息,比如姓名,年龄,性别,手机号码等等
public Map getUserBaseInfo();
//工作环境的信息
public Map getUserOfficeInfo();
//用户的家庭信息
public Map getUserHomeInfo();
}
乙公司的用户对象接口IOuterUser的实现类OuterUser:
package com.licq.adapter;
import java.util.HashMap;
import java.util.Map;
public class OuterUser implements IOuterUser {
@Override
public Map getUserBaseInfo() {
// TODO Auto-generated method stub
HashMap baseInfoMap = new HashMap();
baseInfoMap.put("userName", "这个员工叫薛丁山....");
baseInfoMap.put("mobileNumber", "这个员工电话是...忘记了....");
return baseInfoMap;
}
@Override
public Map getUserOfficeInfo() {
HashMap officeInfo = new HashMap();
officeInfo.put("jobPosition","这个人的职位是元帅...");
officeInfo.put("officeTelNumber", "员工的办公电话是..问公主吧....");
return officeInfo;
}
@Override
public Map getUserHomeInfo() {
HashMap homeInfo = new HashMap();
homeInfo.put("homeTelNumbner", "员工的家庭电话是..保密防止骚扰..");
homeInfo.put("homeAddress", "员工的家庭地址是..保密..");
return homeInfo;
}
}
接下来就是我们的重头戏,适配器类OuterUserInfo:
package com.licq.adapter;
import java.util.Map;
public class OuterUserInfo extends OuterUser implements IUserInfo {
private Map baseInfo= super.getUserBaseInfo(); //员工的基本信息
private Map homeInfo= super.getUserHomeInfo(); //员工的家庭 信息
private Map officeInfo= super.getUserOfficeInfo(); //工作信息
@Override
public String getUserName() {
String userName = (String)this.baseInfo.get("userName");
System.out.println(userName);
return userName;
}
@Override
public String getHomeAddress() {
String homeAddress = (String)this.homeInfo.get("homeAddress");
System.out.println(homeAddress);
return homeAddress;
}
@Override
public String getMobileNumber() {
// TODO Auto-generated method stub
String mobileNum = (String)this.baseInfo.get("mobileNumber");
System.out.println(mobileNum);
return mobileNum;
}
@Override
public String getOfficeTelNumber() {
// TODO Auto-generated method stub
String mobileNum = (String)this.officeInfo.get("officeTelNumber");
System.out.println(mobileNum);
return mobileNum;
}
@Override
public String getJobPosition() {
// TODO Auto-generated method stub
String jobPosition = (String)this.officeInfo.get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
@Override
public String getHomeTelNumber() {
// TODO Auto-generated method stub
String homeTelNumbner = (String)this.homeInfo.get("homeTelNumbner");
System.out.println(homeTelNumbner);
return homeTelNumbner;
}
}
客户端使用用户对象的类Client:
package com.licq.adapter;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//没有与外系统连接的时候,是这样写的
//IUserInfo AUserInfo = new UserInfo();//甲公司收购乙公司前使用
//甲公司收购乙公司后我们使用下面的语句,其他的逻辑不需要修改
IUserInfo combineUserInfo = new OuterUserInfo();
//...........数据库查询等操作..............
System.out.println(combineUserInfo.getUserName());
}
}
适配器的主要作用就是做了一个接口的转换。比较适合做系统的扩展。