什麼是適配器模式
- 將一個類的接口裝換成客戶端所期待的另一種接口,從而使原本因接口不配而無法一起工作的兩個類能夠一起工作。
- 適配器包括兩種:類適配器和對象適配器,大多數情況下,對象適配器比類適配器更加靈活,作爲組件元素而存在。類適配器收到類繼承關係的限制。
適配器模式的優點
- 適配器模式可以讓兩個沒有任何關係的類一起運行
- 增加類的透明性
- 提高類的複用性
- 靈活性高
使用場景
- 想要修改一個已經投產中的接口,主要使用在擴展中,而不是詳細設計中
示例代碼
- 代碼結構
- 接口 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");
}
}