设计模式(九)——适配器模式

适配器模式


适配器模式,不想讲概念,假设个情景:
公司现在要开发一个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 对象,这样,我们的系统基本不用修改什么程序员,所有的人员查询、调用跟本地一样样的。可以看出适配器模式主要就是用来整合这种不同结构,下面附上类图,有助于理解:



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值