設計模式之適配器模式

  1. 什麼是適配器模式

    • 將一個類的接口裝換成客戶端所期待的另一種接口,從而使原本因接口不配而無法一起工作的兩個類能夠一起工作。
    • 適配器包括兩種:類適配器和對象適配器,大多數情況下,對象適配器比類適配器更加靈活,作爲組件元素而存在。類適配器收到類繼承關係的限制。
  2. 適配器模式的優點

    • 適配器模式可以讓兩個沒有任何關係的類一起運行
    • 增加類的透明性
    • 提高類的複用性
    • 靈活性高
  3. 使用場景

    • 想要修改一個已經投產中的接口,主要使用在擴展中,而不是詳細設計中
  4. 示例代碼

    • 代碼結構
      • 接口 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");
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章