1.背景
适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是 220V,日本是 110V,但是这个适配器能够把这些不同的电压转换为你需要的 36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢
2.B接口转换为 A 接口,怎么办?继承,能解决,但是比较傻
通过适配器,把 OuterUser 伪装成我们系统中一个 IUserInfo 对象
本系统的接口:
public interface IUserInfo { //获得用户姓名public String getUserName(); //获得家庭地址public String getHomeAddress(); //手机号码,这个太重要,手机泛滥呀public String getMobileNumber(); //办公电话,一般式座机public String getOfficeTelNumber(); //这个人的职位是啥public String getJobPosition(); //获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作public String getHomeTelNumber(); }
这个接口的实现类:
public class UserInfo implements IUserInfo { /* * 获得家庭地址,下属送礼也可以找到地方*/public String getHomeAddress() { System.out.println("这里是员工的家庭地址...."); return null; } /* * 获得家庭电话号码*/public String getHomeTelNumber() { System.out.println("员工的家庭电话是...."); return null; } /* * 员工的职位,是部门经理还是小兵*/public String getJobPosition() { System.out.println("这个人的职位是BOSS...."); return null; } /* * 手机号码*/public String getMobileNumber() { System.out.println("这个人的手机号码是0000...."); return null; } /* * 办公室电话,烦躁的时候最好“不小心”把电话线踢掉,我经常这么干,对己对人都有好处*/public String getOfficeTelNumber() { System.out.println("办公室电话是...."); return null; } /* * 姓名了,这个老重要了*/public String getUserName() { System.out.println("姓名叫做..."); return null;}
}
本系统程序运行
public class App { public static void main(String[] args) { //没有与外系统连接的时候,是这样写的IUserInfo youngGirl = new UserInfo(); //从数据库中查到101个for(int i=0;i<101;i++){ youngGirl.getMobileNumber(); } }
}
外部系统的接口:
@SuppressWarnings("all")
public interface IOuterUser { //基本信息,比如名称,性别,手机号码了等public Map getUserBaseInfo(); //工作区域信息public Map getUserOfficeInfo(); //用户的家庭信息public Map getUserHomeInfo(); }
外部系统的接口的实现类:
@SuppressWarnings("all")
public class OuterUser implements IOuterUser { /* * 用户的基本信息*/public Map getUserBaseInfo() { HashMap baseInfoMap = new HashMap(); baseInfoMap.put("userName", "这个员工叫混世魔王...."); baseInfoMap.put("mobileNumber", "这个员工电话是....");return baseInfoMap; } /* * 员工的家庭信息*/public Map getUserHomeInfo() { HashMap homeInfo = new HashMap(); homeInfo.put("homeTelNumbner", "员工的家庭电话是...."); homeInfo.put("homeAddress", "员工的家庭地址是...."); return homeInfo; } /* * 员工的工作信息,比如职位了等*/public Map getUserOfficeInfo() { HashMap officeInfo = new HashMap(); officeInfo.put("jobPosition","这个人的职位是BOSS..."); officeInfo.put("officeTelNumber", "员工的办公电话是...."); return officeInfo; }
}
外系统的用户信息包装成我们公司的人员信息呢?看下面的 OuterUserInfo 类源码,也就是
我们的适配器:接口实现的是本系统的接口
@SuppressWarnings("all")
public class OuterUserInfo extends OuterUser implements IUserInfo { private Map baseInfo = super.getUserBaseInfo(); //员工的基本信息
private Map homeInfo = super.getUserHomeInfo(); //员工的家庭 信息
private Map officeInfo = super.getUserOfficeInfo(); //工作信息/* * 家庭地址*/
public String getHomeAddress() { String homeAddress = (String)this.homeInfo.get("homeAddress"); System.out.println(homeAddress); return homeAddress; }
/* * 家庭电话号码*/
public String getHomeTelNumber() { String homeTelNumber = (String)this.homeInfo.get("homeTelNumber"); System.out.println(homeTelNumber); return homeTelNumber; }
/* *职位信息*/
public String getJobPosition() { String jobPosition = (String)this.officeInfo.get("jobPosition"); System.out.println(jobPosition); return jobPosition; }
/* * 手机号码*/
public String getMobileNumber() { String mobileNumber = (String)this.baseInfo.get("mobileNumber"); System.out.println(mobileNumber); return mobileNumber; }
/*
* 办公电话*/
public String getOfficeTelNumber() { String officeTelNumber = (String)this.officeInfo.get("officeTelNumber"); System.out.println(officeTelNumber); return officeTelNumber; }
/* * 员工的名称*/
public String getUserName() { String userName = (String)this.baseInfo.get("userName"); System.out.println(userName); return userName; }
}
运行:
public class App {
public static void main(String[] args) { //没有与外系统连接的时候,是这样写的//IUserInfo youngGirl = new UserInfo();//老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点IUserInfo youngGirl = new OuterUserInfo(); //我们只修改了这一句好 OuterUserInfo 是适配器//从数据库中查到101个for(int i=0;i<101;i++){ youngGirl.getMobileNumber(); } }
}