适配器模式小记【原创】
好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛。今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,日本是110V,但是这个适配器能够把这些不同的电压转换为你需要的36V电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢?是的,一样的作用,两个不同接口,有不同的实现,但是某一天突然上帝命令你把B接口转换为A接口,怎么办?继承,能解决,但是比较傻,而且还违背了OCP原则,怎么办?好在我们还有适配器模式。
Target是一个类(接口),Adaptee是一个接口,通过Adapter把Adaptee包装成Target的一个子类(实现类)。
现在以两个人员管理系统模块的配置来展现适配器模式的魅力!
在图中可以发现,两个人员模块的接口(IUserInfo和IOuterUser)是不一样的。他们各自的方法如图所示,如今需要将IOuterUser加入到IUserInfo中。其关键部分是设配器(OuterUserInfo)的配置。如下:
package com.cbf4life;
import java.util.Map;
/**
*设配器类
* 把OuterUser包装成UserInfo
*/
@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;
}
}
可以发现该设配器继承OuterUser却去实现IUserInfo!这就很好的解释了,设配器的作用:为了将OuterUser包装成IUserInfo。继承OuterUser,具有了父类的属性和方法;实现IUserInfo,客户端可以通过"IUserInfo a = new OuterUserInfo();"调用其于目标类统一的方法。
设配器虽好,但不适合在系统设计阶段采用,没有一个系统分析师会在做详设的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中,就像我们上面的那个例子一样,系统扩展了,不符合原有设计的时候才考虑通过适配器模式减少代码修改带来的风险。
一句话概括适配器模式:继承期待接口(类),实现适配接口。