Adapter Pattern
Converl the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的俩个类能够在一起工作)
不认识的单词
incompatible 不相容,矛盾
例子
俩套人力资源管理系统,俩个不同接口设计,当倆者需要交互时,该如何做?
本公司接口如下
public interface IUserInfo {
public String getUserName();
public String getHomeAddress();
public String getMobileNumber();
public String getOfficeTel();
public String getJobPosition();
public String getHomeTel();
}
//本系统
public class UserInfo implements IUserInfo {
public String getHomeAddress() {
System.out.println("这里是员工的家庭地址");
return null;
}
public String getHomeTel() {
System.out.println("员工的家庭电话是...");
return null;
}
public String getJobPosition() {
System.out.println("员工的职位");
return null;
}
public String getMobileNumber() {
System.out.println("员工的手机号码");
return null;
}
public String getOfficeTel() {
System.out.println("员工的办公室号码");
return null;
}
public String getUserName() {
System.out.println("员工姓名");
return null;
}
}
@SuppressWarnings("unchecked")
public interface IOuterUser {
public Map getUserBaseInfo();
public Map getUserOfficeInfo();
public Map getUserHomeInfo();
}
//另一个系统
public class OuterUser implements IOuterUser {
@SuppressWarnings("unchecked")
public Map getUserBaseInfo() {
HashMap baseInfoMap=new HashMap();
baseInfoMap.put("userName", "这个员工叫Jack");
baseInfoMap.put("mobileNumber", "这个员工电话号码是....");
return baseInfoMap;
}
@SuppressWarnings("unchecked")
public Map getUserHomeInfo() {
HashMap homeInfoMap=new HashMap();
homeInfoMap.put("homeTelNumber", "这个员工家庭号码是");
homeInfoMap.put("homeAddress", "这个员工家庭地址是....");
return homeInfoMap;
}
@SuppressWarnings("unchecked")
public Map getUserOfficeInfo() {
HashMap userOfficeInfoMap=new HashMap();
userOfficeInfoMap.put("jobPosition", "这个员工职位是");
userOfficeInfoMap.put("officeTelNumber", "这个员工办公号码是....");
return userOfficeInfoMap;
}
}
需求
本公司借聘一个中介公司,信息存储在中介公司的系统中, 如果借用人员信息变更,本公司系统需要立马更新。
分析
俩个系统不同,需要将外系统转化成本系统,拿到外系统数据,然后转化成本系统数据,
使用RMI可以将远程的对象当成是本地的对象使用。
/*
* 适配器
* OuterUser为另一个系统的信息管理
* IUserInfo为自身系统接口
* so,问题就是解决在本系统的基础上再增加一个,完成对外来系统的包装,使得能在本系统使用
* 重心还是自身接口的实现,引入外来的源数据提供者OuterUser
*/
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 getHomeTel() {
return null;
}
//就不多写了
public String getJobPosition() {
return null;
}
//就不多写了
public String getMobileNumber() {
return null;
}
//就不多写了
public String getOfficeTel() {
return null;
}
//就不多写了
public String getUserName() {
return null;
}
}
这样在原来系统的基础之上增加了一个外来人员管理类OuterUserInfo,实现了本系统接口的方法,这样就实现了系统转化。也遵循开闭原则。
注意,外系统的远程对象可以通过构造方法来传递,也可以通过继承关系,不管怎么说,远程对象一定是这个新类的成员,不然没法转。
悟
核心:实现本系统接口,加入外系统的各个模板块,在方法中调用外系统模板块中的方法,从而实现了转化外接口,这样一来,系统有选择性的调用了。
优点
适配器可以让俩个没有任何关系的类在一起运行
增加了类的透明性
提高了复用性
非常灵活
使用场景
修改一个已经投产中的接口,比如系统扩展
注意事项
是为了解决已经在服役的项目问题,一般在设计阶段不用考虑,这是一种补救措施。
我是菜鸟,我在路上。