什么是适配器模式
- 将一个类的接口装换成客户端所期待的另一种接口,从而使原本因接口不配而无法一起工作的两个类能够一起工作。
- 适配器包括两种:类适配器和对象适配器,大多数情况下,对象适配器比类适配器更加灵活,作为组件元素而存在。类适配器收到类继承关系的限制。
适配器模式的优点
- 适配器模式可以让两个没有任何关系的类一起运行
- 增加类的透明性
- 提高类的复用性
- 灵活性高
使用场景
- 想要修改一个已经投产中的接口,主要使用在扩展中,而不是详细设计中
示例代码
- 代码结构
- 接口 IUserInfo 、IOuterUser
- 类 UserInfo 、OutUser
- 适配器:类适配器 UserInfoAdapter 、对象适配器UserInfoAdapter
- 类之间的关系
- UserInfo具体实现 IUserInfo,为项目正在使用的接口和类
- OutUser具体实现IOutUser,待适配的新的接口
- UserInfoAdapter 是为了在项目中能够扩展使用IOuterUser接口而使用的适配器
- 代码结构
package com.pattern.adapter;
/**
* 本地的用户信息接口
* @author yjzhou
*/
public interface IUserInfo {
/**
* 获取用户姓名
* @return
*/
public String getUserName();
/**
* 获取用户的地址
* @return
*/
public String getHomeAddress();
/**
* 获取用户的手机号
* @return
*/
public String getMobileNumber();
/**
* 获取用户的工作职位
* @return
*/
public String getJobPosition();
}
package com.pattern.adapter;
import java.util.Map;
/**
* 外部待适配的用户信息接口
* @author yjzhou
*/
public interface IOuterUser {
/**
* Map中存储约定的信息键值对
* @return
*/
public Map<String,String> getUserBaseInfo();
/**
* map中存储约定的信息键值对
* @return
*/
public Map<String,String> getUserOfficeInfo();
}
package com.pattern.adapter;
/**
* 本地用户信息接口实现类
* @author yjzhou
*/
public class UserInfo implements IUserInfo{
private String userName;
private String homeAddress;
private String mobileNumber;
private String jobPosition;
@Override
public String getUserName() {
return userName;
}
@Override
public String getHomeAddress() {
return homeAddress;
}
@Override
public String getMobileNumber() {
return mobileNumber;
}
@Override
public String getJobPosition() {
return jobPosition;
}
}
package com.pattern.adapter;
import java.util.HashMap;
import java.util.Map;
/**
* 外部用户信息接口实现类
* @author yjzhou
* 2016.04.02
*/
public class OutUser implements IOuterUser{
@Override
public Map<String, String> getUserBaseInfo() {
Map<String, String> baseInfo = new HashMap<String,String>();
baseInfo.put("userName", "Tom");
baseInfo.put("homeAddress", "China");
return baseInfo;
}
@Override
public Map<String, String> getUserOfficeInfo() {
Map<String, String> officeInfo = new HashMap<String,String>();
officeInfo.put("mobileNumber", "12345678");
officeInfo.put("jobPosition", "manager");
return officeInfo;
}
}
package com.pattern.adapter.classadpter;
import com.pattern.adapter.IUserInfo;
import com.pattern.adapter.OutUser;
/**
* 类适配器模式
* @author yjzhou
*/
public class UserInfoAdapter extends OutUser implements IUserInfo{
@Override
public String getUserName() {
return super.getUserBaseInfo().get("userName");
}
@Override
public String getHomeAddress() {
return super.getUserBaseInfo().get("homeAddress");
}
@Override
public String getMobileNumber() {
return super.getUserOfficeInfo().get("mobileNumber");
}
@Override
public String getJobPosition() {
return super.getUserOfficeInfo().get("jobPosition");
}
}
package com.pattern.adapter.objectadapter;
import com.pattern.adapter.IOuterUser;
import com.pattern.adapter.IUserInfo;
/**
* 对象适配器
* @author yjzhou
*/
public class UserInfoAdapter implements IUserInfo{
//将IOuterUser作为属性,需要实现IuserInfo接口的方法时,用outUser
private IOuterUser outerUser;
public UserInfoAdapter(IOuterUser outerUser) {
this.outerUser = outerUser;
}
@Override
public String getUserName() {
return outerUser.getUserBaseInfo().get("userName");
}
@Override
public String getHomeAddress() {
return outerUser.getUserBaseInfo().get("homeAddress");
}
@Override
public String getMobileNumber() {
return outerUser.getUserOfficeInfo().get("mobileNumber");
}
@Override
public String getJobPosition() {
return outerUser.getUserOfficeInfo().get("jobPosition");
}
}