适配器模式:将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
共有两类适配器模式:
对象适配器模式
-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
类适配器模式
-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用方法:继承和依赖
优点:
- 可以让任何两个没有关联的类一起运行。
- 增加了类的透明性。
- 提高了类的复用度。
- 灵活性非常好。
缺点:
- 过多使用适配器,会使系统非常零乱。
注意:通常使用适配器,是在现有的系统基础上,为了对现有系统不造成太大影响,但是也要兼容其他系统之间的对接任务,采用适配器模式,在两者之间搭建一个适配器,让彼此挂钩。
场景:有动机地修改一个正常运行的系统的接口。
案例:找不到出处了,但是此处案例很容易理解这个模式。
1.类适配器模式 继承关系
/**
* 把OuterUser包装成UserInfo
* 类适配器
*/
public class OuterUserInfoAdaper 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;
}
}
2.对象适配器 依赖关系
/**
* 把OuterUser包装成UserInfo
* 对象适配器
*/
public class OuterUserInfoAdaper implements IUserInfo {
private OuterUser outerUser;
public OuterUserInfoAdaper(OuterUser voltage220v) {
this.outerUser = voltage220v;
}
/*
* 家庭地址
*/
public String getHomeAddress() {
String homeAddress = (String) outerUser.getUserBaseInfo().get("homeAddress");
System.out.println(homeAddress);
return homeAddress;
}
/*
* 家庭电话号码
*/
public String getHomeTelNumber() {
String homeTelNumber = (String) outerUser.getUserHomeInfo().get("homeTelNumber");
System.out.println(homeTelNumber);
return homeTelNumber;
}
/*
*职位信息
*/
public String getJobPosition() {
String jobPosition = (String) outerUser.getUserOfficeInfo().get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
/*
* 手机号码
*/
public String getMobileNumber() {
String mobileNumber = (String) outerUser.getUserBaseInfo().get("mobileNumber");
System.out.println(mobileNumber);
return mobileNumber;
}
/*
* 办公电话
*/
public String getOfficeTelNumber() {
String officeTelNumber = (String) outerUser.getUserOfficeInfo().get("officeTelNumber");
System.out.println(officeTelNumber);
return officeTelNumber;
}
/*
* 员工的名称
*/
public String getUserName() {
String userName = (String) outerUser.getUserBaseInfo().get("userName");
System.out.println(userName);
return userName;
}
}
公共部分:
/**
* 外系统的人员信息
*/
@SuppressWarnings("all")
public interface IOuterUser {
//基本信息,比如名称,性别,手机号码了等
public Map getUserBaseInfo();
//工作区域信息
public Map getUserOfficeInfo();
//用户的家庭信息
public Map getUserHomeInfo();
}
/**
* 自己系统的
*/
public interface IUserInfo {
//获得用户姓名
public String getUserName();
//获得家庭地址
public String getHomeAddress();
//手机号码,这个太重要,手机泛滥呀
public String getMobileNumber();
//办公电话,一般式座机
public String getOfficeTelNumber();
//这个人的职位是啥
public String getJobPosition();
//获得家庭电话,这个有点缺德,我是不喜欢打家庭电话讨论工作
public String getHomeTelNumber();
}
/**
* 外系统的用户信息的实现类
*/
@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;
}
}
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 Client {
public static void main(String[] args) {
//没有与外系统连接的时候,是这样写的
//IUserInfo youngGirl = new UserInfo();
//老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点
IUserInfo youngGirlClass = new OuterUserInfoAdaper(); //我们只修改了这一句好 类适配器
//从数据库中查到101个
for (int i = 0; i < 101; i++) {
youngGirlClass.getMobileNumber();
}
System.out.println("----------------------------------------");
IUserInfo youngGirlObject = new Adapter.Objectadapter.OuterUserInfoAdaper(new OuterUser()); //我们只修改了这一句好 对象适配器
for (int i = 0; i < 101; i++) {
youngGirlObject.getMobileNumber();
}
}
}