今天上班有点点空闲时间、于是上午抽时间写了个适配器模式的Demo程序。
一、适配器的定义:
一讲到适配器模式、我的第一反应就是想到家里的电源排插、电源排插上有两孔的、有三孔的、它能适用于不同电头插。还有 你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,日本是110V,但是这个适配器能够把这些不同的电压转换为你需要的36V 电压,保证你的笔记本能够正常运行、这里是通俗的理解适配器、专业一点来讲:两个不同的接口,有不同的实现方法,但是某一天突然上帝命令你把B 接口转换为A 接口,这时怎么办?
二、适配器的通用类图:
三、我的适配器demo程序:
程序背景:
假设A公司有一套用户管理系统,类图如下:
B公司的用户管理系统类图如下:
要求:A公司系统去调用B公司用户管理系统、将B公司系统里的用户信息获得并保存到自己的系统里用户模块中。
根据两个公司的用户模块类图我们可以发现他们的用户接口不同、如B公司是把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了HashMap
中,这样一来,A公司的系统要和他们系统有交互,怎么办?使用适配器模式。下面是类图:
程序代码如下:
A公司用户接口:IUserInfo.java
package com.ice.adapter; /** * 这是A公司用户管理模块的用户接口 * @author [email protected] * */ public interface IUserInfo { // 获得用户姓名 public String getUserName(); // 获得家庭地址 public String getHomeAddress(); // 手机号码,这个太重要,手机泛滥呀 public String getMobileNumber(); // 办公电话,一般式座机 public String getOfficeTelNumber(); // 这个人的职位是啥 public String getJobPosition(); // 获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作 public String getHomeTelNumber(); }
package com.ice.adapter; import java.util.Map; /** * 这是B公司用户模块接口、相对于A公司是外部系统人员接口 * @author [email protected] * @描述 我们有发现B公司把人的信息分为了三部分:基本信息,办公信息和个人家庭信息,并且都放到了HashMap中, * 比如人员的姓名放到BaseInfo 信息中,家庭地址放到HomeInfo 中, */ public interface IOuterUser { //基本信息,比如名称,性别,手机号码了等 public Map<String,String> getUserBaseInfo(); //工作区域信息 public Map<String,String> getUserOfficeInfo(); //用户的家庭信息 public Map<String,String> getUserHomeInfo(); }
package com.ice.adapter; import java.util.HashMap; import java.util.Map; /** * B公司(外系统)的用户信息的具体实现类 * @author [email protected] * */ 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; } }
package com.ice.adapter; import java.util.Map; /** * 这里就是一个适配器类 * 把B公司(外系统)的用户信息包装成A公司的人员信息,然后供A公司系统调用 * @author [email protected] * */ 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; } }
package com.ice.adapter; /** * 具体的应用、在这里可以看成是A公司系统调用B公司的系统的调用程序 * @author [email protected] * */ 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>