今天上班有点点空闲时间、于是上午抽时间写了个适配器模式的Demo程序。
一、适配器的定义:
一讲到适配器模式、我的第一反应就是想到家里的电源排插、电源排插上有两孔的、有三孔的、它能适用于不同电头插。还有 你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,日本是110V,但是这个适配器能够把这些不同的电压转换为你需要的36V 电压,保证你的笔记本能够正常运行、这里是通俗的理解适配器、专业一点来讲:两个不同的接口,有不同的实现方法,但是某一天突然上帝命令你把B 接口转换为A 接口,这时怎么办?
二、适配器的通用类图:
三、我的适配器demo程序:
程序背景:
假设A公司有一套用户管理系统,类图如下:
B公司的用户管理系统类图如下:
要求:A公司系统去调用B公司用户管理系统、将B公司系统里的用户信息获得并保存到自己的系统里用户模块中。
根据两个公司的用户模块类图我们可以发现他们的用户接口不同、如B公司是把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了HashMap
中,这样一来,A公司的系统要和他们系统有交互,怎么办?使用适配器模式。下面是类图:
程序代码如下:
A公司用户接口:IUserInfo.java
package com.ice.adapter;
/**
* 这是A公司用户管理模块的用户接口
* @author lvzb.software@qq.com
*
*/
public interface IUserInfo {
// 获得用户姓名
public String getUserName();
// 获得家庭地址
public String getHomeAddress();
// 手机号码,这个太重要,手机泛滥呀
public String getMobileNumber();
// 办公电话,一般式座机
public String getOfficeTelNumber();
// 这个人的职位是啥
public String getJobPosition();
// 获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作
public String getHomeTelNumber();
}
B公司用户接口:IOuterUser.java
package com.ice.adapter;
import java.util.Map;
/**
* 这是B公司用户模块接口、相对于A公司是外部系统人员接口
* @author lvzb.software@qq.com
* @描述 我们有发现B公司把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了HashMap中,
* 比如人员的姓名放到BaseInfo 信息中,家庭地址放到HomeInfo 中,
*/
public interface IOuterUser {
//基本信息,比如名称,性别,手机号码了等
public Map<String,String> getUserBaseInfo();
//工作区域信息
public Map<String,String> getUserOfficeInfo();
//用户的家庭信息
public Map<String,String> getUserHomeInfo();
}
B公司用户实现类:OuterUser.java
package com.ice.adapter;
import java.util.HashMap;
import java.util.Map;
/**
* B公司(外系统)的用户信息的具体实现类
* @author lvzb.software@qq.com
*
*/
public class OuterUser implements IOuterUser {
@Override
public Map<String,String> getUserBaseInfo() {
HashMap<String,String> baseInfoMap = new HashMap<String,String>();
baseInfoMap.put("userName", "B公司小吕");
baseInfoMap.put("mobileNumber", "13874896584");
return baseInfoMap;
}
@Override
public Map<String,String> getUserOfficeInfo() {
HashMap<String,String> officeInfoMap = new HashMap<String,String>();
officeInfoMap.put("officeTelNumber", "020-8888888");
officeInfoMap.put("jobPosition", "开发小组长");
return officeInfoMap;
}
@Override
public Map<String,String> getUserHomeInfo() {
HashMap<String,String> homeInfoMap = new HashMap<String,String>();
homeInfoMap.put("homeTelNumber", "0734-88888888");
homeInfoMap.put("homeAddress", "湖南省长沙市xxx");
return homeInfoMap;
}
}
适配器类: OuterUserInfo.java
package com.ice.adapter;
import java.util.Map;
/**
* 这里就是一个适配器类
* 把B公司(外系统)的用户信息包装成A公司的人员信息,然后供A公司系统调用
* @author lvzb.software@qq.com
*
*/
public class OuterUserInfo extends OuterUser implements IUserInfo {
private Map<String,String> baseInfoMap = super.getUserBaseInfo();
private Map<String,String> officeInfoMap = super.getUserOfficeInfo();
private Map<String,String> homeInfoMap = super.getUserHomeInfo();
/**
* 用户姓名
*/
@Override
public String getUserName() {
String userName = baseInfoMap.get("userName");
// System.out.println("获得外系统用户姓名:"+userName);
return userName;
}
/**
* 手机号码
*/
@Override
public String getMobileNumber() {
String mobileNumber = baseInfoMap.get("mobileNumber");
// System.out.println("获得外系统用户手机号码:"+mobileNumber);
return mobileNumber;
}
/**
* 办公电话
*/
@Override
public String getOfficeTelNumber() {
String officeTelNumber = officeInfoMap.get("officeTelNumber");
// System.out.println("获得外系统用户办公号码:"+officeTelNumber);
return officeTelNumber;
}
/**
* 工作职位
*/
@Override
public String getJobPosition() {
String jobPosition = officeInfoMap.get("jobPosition");
// System.out.println("获得外系统用户工作职位:"+jobPosition);
return jobPosition;
}
/**
* 家庭电话
*/
@Override
public String getHomeTelNumber() {
String homeTelNumber = homeInfoMap.get("homeTelNumber");
// System.out.println("获得外系统用户家庭电话:"+homeTelNumber);
return homeTelNumber;
}
/**
* 家庭地址
*/
@Override
public String getHomeAddress() {
String homeAddress = homeInfoMap.get("homeAddress");
// System.out.println("获得外系统用户家庭地址:"+homeAddress);
return homeAddress;
}
}
程序调用类:App.java
package com.ice.adapter;
/**
* 具体的应用、在这里可以看成是A公司系统调用B公司的系统的调用程序
* @author lvzb.software@qq.com
*
*/
public class App {
/**
* @param args
*/
public static void main(String[] args) {
OuterUserInfo outerUserInfo = new OuterUserInfo();
System.out.println("A公司用户系统开始调用B公司用户系统用户信息.....\n");
System.out.println("获得外系统用户姓名:"+outerUserInfo.getUserName());
System.out.println("获得外系统用户手机号码:"+outerUserInfo.getMobileNumber());
System.out.println("获得外系统用户办公号码:"+outerUserInfo.getOfficeTelNumber());
System.out.println("获得外系统用户工作职位:"+outerUserInfo.getJobPosition());
System.out.println("获得外系统用户家庭电话:"+outerUserInfo.getHomeTelNumber());
System.out.println("获得外系统用户家庭地址:"+outerUserInfo.getHomeAddress());
System.out.println("\nA公司用户系统已成功调用B公司用户系统.....");
}
}
程序运行结果:
这就是适配器模式、每一种设计模式都是一种经典的编程思想!我是小吕 <ice>