**定義**:將一個類的接口變換成客戶端所期待的的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
**適配器一般模式:**

Target角色:
該角色定義把其他類轉換為何種接口,也就是我們的期望接口。
Adaptee源角色
你想把誰轉換成目標角色,這個“誰”是原角色,它是已經存在的、運行良好的類或對象,經過Adapter包裝,轉換成一個全新的角色。
Adapter適配器角色
適配器模式的核心角色,適配器角色是需要新建立的。你想把誰轉換成目標角色,就需要通過繼承或者類關聯的方式來操作。
~~~
public class AdapterPattern {
public static void main(String[] args) {
//原有的業務邏輯
Target target = new ConcreteTarget();
target.doSomething();
//增加了適配器角色后的業務邏輯
Target target2 = new Adapter();
target2.doSomething();
}
}
/**
* 目標角色,需要適配器所轉換的目標的。
* @author admin
*
*/
interface Target{
//目標角色,所擁有的方法。
void doSomething();
}
class ConcreteTarget implements Target{
@Override
public void doSomething() {
System.out.println("我是目標角色,現在要使用我的...");
}
}
/**
* 源角色,適配器需要從這里轉換。
* @author admin
*
*/
abstract class Adaptee{
public void doSome(){
System.out.println("我是源角色,從我這里轉變...");
}
}
/**
* 適配器角色,將原角色轉換成目標角色。
* @author admin
*
*/
class Adapter extends Adaptee implements Target{
@Override
public void doSomething() {
super.doSome();
}
}
~~~
## 一個例子:
已知A公司網站的員工信息規劃分類是IUserInfo。而B公司網站的員工信息是IOuterUser。
B公司有一部分人員外派到A公司,并且需要將員工信息加入到A公司的員工信息網站中。這樣由于兩者的接口不同, 所以要用到---適配器模式。

~~~
public class AdapterTest {
public static void main(String[] args) {
//測試Adapter是否能用
IUserInfo userInfo = new UserAdapter();
//獲取員工家庭電話
System.out.println(userInfo.getUserName()+"---"+userInfo.getHomeTelNumber());
}
}
/**
* A公司員工信息接口,是目標接口。
*/
interface IUserInfo {
//獲取員工姓名
String getUserName();
//獲取員工住址
String getUserAddress();
//獲取員工聯系方式
String getTelNumber();
//獲取辦公電話
String getOfficeTelNumber();
//獲取職位名稱
String getJobPosition();
//獲取家庭電話
String getHomeTelNumber();
}
/**
* B公司外派人員的基本信息接口,是個源角色,待轉換的角色。
* @author admin
*
*/
interface IOuterInfo{
//基本信息
HashMap<String, String> getUserBaseInfo();
//辦公信息
HashMap<String, String> getOfficeInfo();
//家庭信息
HashMap<String, String> getHomeInfo();
}
/**
* B公司外派人員的實現接口。
* 他將一些具體信息分類,存儲在Map集合中。
* @author admin
*
*/
class OuterInfo implements IOuterInfo{
/**
* 用戶的基本信息
*/
@Override
public HashMap<String, String> getUserBaseInfo() {
HashMap<String, String> baseInfoMap = new HashMap<String, String>();
baseInfoMap.put("userName", "lzl");
baseInfoMap.put("mobileNumber", "18931373457");
return baseInfoMap;
}
@Override
public HashMap<String, String> getOfficeInfo() {
HashMap<String, String> officeInfoMap = new HashMap<String, String>();
officeInfoMap.put("officeTelNumber", "0332-24438");
officeInfoMap.put("jobPosition","ceo");
return officeInfoMap;
}
@Override
public HashMap<String, String> getHomeInfo() {
HashMap<String, String> homeInfoMap = new HashMap<String, String>();
homeInfoMap.put("address", "華爾街");
homeInfoMap.put("homeTelNumber", "6753443");
return homeInfoMap;
}
}
/**
* 轉換角色,相當于Adapter,
* 主要將原角色轉換成目標角色。
* @author admin
*
*/
class UserAdapter extends OuterInfo implements IUserInfo{
@Override
public String getUserName() {
String name = super.getUserBaseInfo().get("userName");
return name;
}
@Override
public String getUserAddress() {
String address = super.getHomeInfo().get("address");
return address;
}
@Override
public String getTelNumber() {
String telNumber = super.getUserBaseInfo().get("mobileNumber");
return telNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = super.getOfficeInfo().get("officeTelNumber");
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = super.getOfficeInfo().get("jobPosition");
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = super.getHomeInfo().get("homeTelNumber");
return homeTelNumber;
}
}
~~~
## 適配器的擴展
B公司的員工設計表如果是這樣的怎么實現?
通過類關聯的方式實現適配器轉換。

~~~
public class AdapterTest {
public static void main(String[] args) {
//測試Adapter是否能用
IUserInfo userInfo = new UserAdapter(new BaseInfo(),new OfficeInfo(),new HomeInfo());
//獲取員工家庭電話
System.out.println(userInfo.getUserName()+"---"+userInfo.getHomeTelNumber());
}
}
/**
* A公司員工信息接口,是目標接口。
*/
interface IUserInfo {
//獲取員工姓名
String getUserName();
//獲取員工住址
String getUserAddress();
//獲取員工聯系方式
String getTelNumber();
//獲取辦公電話
String getOfficeTelNumber();
//獲取職位名稱
String getJobPosition();
//獲取家庭電話
String getHomeTelNumber();
}
/**
* B公司外派人員的基本信息接口,是個源角色,待轉換的角色。
* @author admin
*
*/
interface IBaserInfo{
//基本信息
HashMap<String, String> getUserBaseInfo();
}
/**
* B公司外派人員的辦公信息接口,是個源角色,待轉換的角色。
* @author admin
*
*/
interface IOfficeUserInfo{
//辦公信息
HashMap<String, String> getOfficeInfo();
}
/**
* B公司外派人員的家庭信息接口,是個源角色,待轉換的角色。
* @author admin
*
*/
interface IHomeInfo{
//家庭信息
HashMap<String, String> getHomeInfo();
}
/**
* B公司外派人員的實現接口。
* 他將一些具體信息分類,存儲在Map集合中。
* @author admin
*
*/
class BaseInfo implements IBaserInfo{
/**
* 用戶的基本信息
*/
@Override
public HashMap<String, String> getUserBaseInfo() {
HashMap<String, String> baseInfoMap = new HashMap<String, String>();
baseInfoMap.put("userName", "lzl");
baseInfoMap.put("mobileNumber", "18931373457");
return baseInfoMap;
}
}
/**
* B公司外派人員的實現接口。
* 他將一些辦公信息分類,存儲在Map集合中。
* @author admin
*
*/
class OfficeInfo implements IOfficeUserInfo{
@Override
public HashMap<String, String> getOfficeInfo() {
HashMap<String, String> officeInfoMap = new HashMap<String, String>();
officeInfoMap.put("officeTelNumber", "0332-24438");
officeInfoMap.put("jobPosition","ceo");
return officeInfoMap;
}
}
/**
* B公司外派人員的實現接口。
* 他將一些家庭信息分類,存儲在Map集合中。
* @author admin
*
*/
class HomeInfo implements IHomeInfo{
@Override
public HashMap<String, String> getHomeInfo() {
HashMap<String, String> homeInfoMap = new HashMap<String, String>();
homeInfoMap.put("address", "華爾街");
homeInfoMap.put("homeTelNumber", "6753443");
return homeInfoMap;
}
}
/**
* 轉換角色,相當于Adapter,
* 主要將原角色轉換成目標角色。
* @author admin
*
*/
class UserAdapter implements IUserInfo{
private BaseInfo baseInfo;
private OfficeInfo officeInfo;
private HomeInfo homeInfo;
private HashMap<String, String> baseInfoMap;
private HashMap<String, String> officeInfoMap;
private HashMap<String, String> homeInfoMap;
public UserAdapter(BaseInfo baseInfo ,OfficeInfo officeInfo,HomeInfo homeInfo) {
this.baseInfo = baseInfo;
this.officeInfo = officeInfo;
this.homeInfo = homeInfo;
this.baseInfoMap = this.baseInfo.getUserBaseInfo();
this.officeInfoMap = this.officeInfo.getOfficeInfo();
this.homeInfoMap = this.homeInfo.getHomeInfo();
}
@Override
public String getUserName() {
String name = this.baseInfoMap.get("userName");
return name;
}
@Override
public String getUserAddress() {
String address = this.homeInfoMap.get("address");
return address;
}
@Override
public String getTelNumber() {
String telNumber = this.baseInfoMap.get("mobileNumber");
return telNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = this.officeInfoMap.get("officeTelNumber");
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = this.officeInfoMap.get("jobPosition");
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = this.homeInfoMap.get("homeTelNumber");
return homeTelNumber;
}
}
~~~
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式