适配器模式读书笔记(设计模式之禅)
1、定义
适配器模式(Adapter Pattern)的定义如下:Convert the interface of a class into another interface clients expect. Adapterlets classes work together that couldn’t otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个。
类比:笔记本的电源适配器,可以使用在110~220V之间变化的电源。简单地说,适配器模式就是通过某种机制把一个接口或类转换成其他的接口或类。电源适配器正是一个很好的例子,它可以将我们的家用220V电源转换为我们需要的电压,比如手机需要的几伏特。
图解:
A需要和B结合来实现某种功能,但是,A没法直接和B结合,这时候,就需要适配器C了。C在其中起的是角色转换的作用。
2、适配器模式的三个角色
-
Target目标角色
该角色定义把其他类转换为何种接口,也就是我们的期望接口,例子中的IUserInfo就是目标角色。
-
Adaptee源角色
你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的/运行良好的类或对象。例子中的OuterUser就是源角色。
-
Adapter适配器角色
适配器模式的核心角色,也就是中间起转换作用的对象。适配器角色通过继承或者类关联(也叫组合)的方式,将源角色转换为目标角色。
一个简单的例子
目标角色:
public interface Target {
// 目标角色有自己的方法
public void request();
}
目标角色的实现类:
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("if you need any help, please call me!");
}
}
源角色:
public class Adaptee {
// 原有的业务逻辑
public void doSomething() {
System.out.println("I'm kind of busy, leave me alone, please!");
}
}
适配器角色:
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.doSomething();
}
}
场景类:
public class Client {
public static void main(String[] args) {
// 原有的业务逻辑
Target target = new ConcreteTarget();
target.request();
// 现在增加了适配器角色后的业务逻辑
Target target1 = new Adapter();
target1.request();
}
}
3、帮助理解的最初和最后的例子
理解顺序和上面的基础的例子相一致。
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 {
/**
* 获得用户姓名
* @return
*/
@Override
public String getUserName() {
System.out.println("姓名叫做...");
return null;
}
/**
* 获得家庭地址
* @return
*/
@Override
public String getHomeAddress() {
System.out.println("这里是员工的家庭地址...");
return null;
}
/**
* 手机号码
* @return
*/
@Override
public String getMobileNumber() {
System.out.println("这个人的电话号码是0000...");
return null;
}
/**
* 办公电话,一般是座机
* @return
*/
@Override
public String getOfficeTelNumber() {
System.out.println("办公室电话是...");
return null;
}
/**
* 这个人的职位是什么
* @return
*/
@Override
public String getJobPosition() {
System.out.println("这个人的职位是BOSS...");
return null;
}
/**
* 获得家庭电话
* @return
*/
@Override
public String getHomeTelNumber() {
System.out.println("员工的家庭电话是...");
return null;
}
}
public interface IOuterUser {
// 基本信息,比如名称、性别、手机号码等
public Map getUserBaseInfo();
// 工作区域信息
public Map getUserOfficeInfo();
// 用户的家庭信息
public Map getUserHomeInfo();
}
public class OuterUser implements IOuterUser {
@Override
public Map getUserBaseInfo() {
HashMap baseInfoMap = new HashMap();
baseInfoMap.put("userName", "这个员工叫张三...");
baseInfoMap.put("mobileNumber", "这个员工电话是...");
return baseInfoMap;
}
@Override
public Map getUserOfficeInfo() {
HashMap officeInfo = new HashMap();
officeInfo.put("jobPosition", "这个人的职位是BOSS...");
officeInfo.put("officeTelNumber", "员工的办公电话是...");
return officeInfo;
}
@Override
public Map getUserHomeInfo() {
HashMap homeInfo = new HashMap();
homeInfo.put("homeTelNumber", "员工的家庭电话是...");
homeInfo.put("homeAddress", "员工的家庭地址是...");
return homeInfo;
}
}
public class OuterUserInfo extends OuterUser implements IUserInfo {
private Map baseInfo = super.getUserBaseInfo(); // 员工的基本信息
private Map homeInfo = super.getUserHomeInfo(); // 员工的家庭信息
private Map officeInfo = super.getUserOfficeInfo(); // 工作信息
/**
* 员工姓名
* @return
*/
@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() {
String mobileNumber = (String) this.baseInfo.get("mobileNumber");
System.out.println(mobileNumber);
return mobileNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = (String) this.officeInfo.get("officeTelNumber");
System.out.println(officeTelNumber);
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = (String) this.officeInfo.get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = (String) this.homeInfo.get("homeTelNumber");
System.out.println(homeTelNumber);
return homeTelNumber;
}
}
public class Client {
/*public static void main(String[] args) {
// 没有与外系统连接的时候,是这样写的
IUserInfo youngGirl = new UserInfo();
// 从数据库中查到101个
for (int i = 0; i < 101; i++) {
youngGirl.getMobileNumber();
}
}*/
public static void main(String[] args) {
IUserInfo youngGirl = new OuterUserInfo();
// 从数据库中查到101个
for (int i = 0; i < 101; i++) {
youngGirl.getMobileNumber();
}
}
}
对象版本
public interface IOuterUserBaseInfo {
// 基本信息,比如名称、性别、手机号码等
public Map getUserBaseInfo();
}
public class OuterUserBaseInfo implements IOuterUserBaseInfo {
@Override
public Map getUserBaseInfo() {
HashMap baseInfoMap = new HashMap();
baseInfoMap.put("userName", "这个员工叫张三...");
baseInfoMap.put("mobileNumber", "这个员工电话是...");
return baseInfoMap;
}
}
public interface IOuterUserHomeInfo {
// 用户的家庭信息
public Map getUserHomeInfo();
}
public class OuterUserHomeInfo implements IOuterUserHomeInfo {
@Override
public Map getUserHomeInfo() {
HashMap homeInfo = new HashMap();
homeInfo.put("homeTelNumber", "员工的家庭电话是...");
homeInfo.put("homeAddress", "员工的家庭地址是...");
return homeInfo;
}
}
public interface IOuterUserOfficeInfo {
// 工作区域信息
public Map getUserOfficeInfo();
}
public class OuterUserOfficeInfo implements IOuterUserOfficeInfo {
@Override
public Map getUserOfficeInfo() {
HashMap officeInfo = new HashMap();
officeInfo.put("jobPosition", "这个人的职位是BOSS...");
officeInfo.put("officeTelNumber", "员工的办公电话是...");
return officeInfo;
}
}
public class OuterUserInfo implements IUserInfo {
// 源目标对象
private IOuterUserBaseInfo baseInfo = null; // 员工的基本信息
private IOuterUserHomeInfo homeInfo = null; // 员工的家庭信息
private IOuterUserOfficeInfo officeInfo = null; // 工作信息
// 数据处理
private Map baseMap = null;
private Map homeMap = null;
private Map officeMap = null;
// 构造函数传递对象
public OuterUserInfo(IOuterUserBaseInfo _baseInfo, IOuterUserHomeInfo _homeInfo, IOuterUserOfficeInfo _officeInfo) {
this.baseInfo = _baseInfo;
this.homeInfo = _homeInfo;
this.officeInfo = _officeInfo;
// 数据处理
this.baseMap = this.baseInfo.getUserBaseInfo();
this.homeMap = this.homeInfo.getUserHomeInfo();
this.officeMap = this.officeInfo.getUserOfficeInfo();
}
@Override
public String getUserName() {
String userName = (String) this.baseMap.get("userName");
System.out.println(userName);
return userName;
}
@Override
public String getHomeAddress() {
String homeAddress = (String) this.homeMap.get("homeAddress");
System.out.println(homeAddress);
return homeAddress;
}
@Override
public String getMobileNumber() {
String mobileNumber = (String) this.baseMap.get("mobileNumber");
System.out.println(mobileNumber);
return mobileNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = (String) this.officeMap.get("officeTelNumber");
System.out.println(officeTelNumber);
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = (String) this.officeMap.get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = (String) this.homeMap.get("homeTelNumber");
System.out.println(homeTelNumber);
return homeTelNumber;
}
}
public class Client {
public static void main(String[] args) {
// 外系统的人员信息
IOuterUserBaseInfo baseInfo = new OuterUserBaseInfo();
IOuterUserHomeInfo homeInfo = new OuterUserHomeInfo();
IOuterUserOfficeInfo officeInfo = new OuterUserOfficeInfo();
// 传递三个对象
IUserInfo youngGirl = new OuterUserInfo(baseInfo, homeInfo, officeInfo);
// 从数据库中查到101个
for (int i = 0; i < 101; i++) {
youngGirl.getMobileNumber();
}
}
}