适配器模式
适配器模式,不想讲概念,假设个情景:
公司现在要开发一个ERP系统,需要查询公司所有员工的信息,这个很好办,很快开发完了;然后来了个需求,公司收购了一家公司,该公司的组织结构与本公司不同,他们有自己的ERP系统,并且希望保留自己的ERP系统,但是总公司管理人员可不想使用两个ERP系统,他习惯了用总公司的ERP系统,所以,我们需要把子公司的ERP系统整合到总公司的ERP系统中,而总公司的ERP系统界面不变化。问题是我们发现,两个ERP系统的用于保存用户数据的数据结构是不同的,同时大家可能会问,这两个对象都不在一个系统中,你如何使用呢?(简单!RMI 已经帮我们做了这件事情,只要有接口,就可以把远程的对象当成本地的对象使用)那下边我们来看具体的代码实现:
总公司获取用户信息的接口
public interface IUserInfo {
/**
* getUsername:获得用户名称.
* @author gongyong
*/
String getUsername();
/**
* getUserPhone:获得用户电话号码.
* @author gongyong
*/
String getUserPhone();
}
实现:
public class UserInfo implements IUserInfo{
/**
* 该方法用户从数据库中查询一个人的名字.
* @see com.gy.designpattern.adapter.IUserInfo#getUsername()
*/
public String getUsername(){
return "这个人的名字是....";
}
/**
* 该方法从数据库中查询一个人的电话号码.
* @see com.gy.designpattern.adapter.IUserInfo#getUserPhone()
*/
public String getUserPhone(){
return "这个人的电话是....";
}
}
要使用该方法,如下:
public class Client {
public static void main(String [] args){
IUserInfo userInfo =new UserInfo();
userInfo.getUsername();
System.out.println(userInfo.getUsername());
}
然后,这是子公司的获取用户信息的接口
public interface IOuterUser {
/**
* getUserInfo:获得用户的信息,返回一个map.
* @author gongyong
*/
Map getUserInfo();
}
实现:
public class OuterUser implements IOuterUser{
/**
* 从数据库中查询用户的基本信息,然后返回到一个map中.
* @see com.gy.designpattern.adapter.IOuterUser#getUserInfo()
*/
@SuppressWarnings("rawtypes")
public Map getUserInfo(){
Map userInfoMap=new HashMap();
userInfoMap.put("username", "来自外部,这个人的名字是。。。");
userInfoMap.put("phone", "来自外部,这个人的号码是。。。");
return userInfoMap;
}
}
看到没,子公司获取的用户信息是保存在一个map中的,这样我们就没法使用总公司的getUsername方法来返回用户的基本信息,但是我们有办法,看下面:
public class OuterUserInfo extends OuterUser implements IUserInfo{
private Map outerUserInfo=super.getUserInfo();
/**
* 从数据查询用户名字.
* @see com.gy.designpattern.adapter.IUserInfo#getUsername()
*/
public String getUsername(){
String username=(String) outerUserInfo.get("username");
return username;
}
/**
* 从数据查询用户电话.
* @see com.gy.designpattern.adapter.IUserInfo#getUserPhone()
*/
@Override
public String getUserPhone(){
String phone=(String) outerUserInfo.get("phone");
return phone;
}
}
我们用一个OuterUserInfo 继承自OuterUser 然后强制其实现总公司的IUserInfo接口,这样就类似我们把子公司的类伪装成了总公司的 IUserInfo 接口,这样就可以像原来一样调用相同的接口获取用户信息啦,看如下调用方式
public class Client {
public static void main(String [] args){
//这是公司本部员工信息的获取方式
//IUserInfo userInfo =new UserInfo();
IUserInfo userInfo =new OuterUserInfo();
userInfo.getUsername();
System.out.println(userInfo.getUsername());
}
}
通过适配器,把OuterUser 伪装成我们系统中一个IUserInfo 对象,这样,我们的系统基本不用修改什么程序员,所有的人员查询、调用跟本地一样样的。可以看出适配器模式主要就是用来整合这种不同结构,下面附上类图,有助于理解: