設計模式——適配器模式

《Head First 設計模式》《設計模式之禪(第二版)》 學習筆記,碼雲同步更新中

如有錯誤或不足之處,請一定指出,謝謝~

目錄

設計原則
設計模式

適配器模式(Adapter Pattern)

定義
  • 將一個接口轉換成客戶希望的另一個接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作
優點
  • 可以讓兩個沒有任何關係的類一起運行,讓目標類和適配類實現解耦
  • 增加了類的透明性
  • 提高了類的複用度
  • 具有非常好的靈活性
使用場景
  • 系統需要使用已經投入使用的類,但這些類不符合需求
案例

原本系統中有本公司員工信息的IUserInfo接口和UserInfo實現類。
但有一天從外部借調了一批員工過來,他們的用戶信息結構OuterUserInfo和我們並不一樣。
現在需要列一張全部員工名單,這就需要用到適配器模式了。

代碼
/**
 * 我司員工信息接口
 */
public interface IUserInfo {

    /**
     * 獲取姓名
     * @return
     */
    public String getUserName();

    /**
     * 獲取手機號碼
     * @return
     */
    public String getMobilePhoneNumber();

    /**
     * 獲取家庭住址
     * @return
     */
    public String getAddress();

    /**
     * 獲取職位
     * @return
     */
    public String getPosition();
}

/**
 * 我司員工信息實現類
 */
public class UserInfo implements IUserInfo{

    @Override
    public String getUserName() {
        return "李四";
    }

    @Override
    public String getMobilePhoneNumber() {
        return "手機號碼:188xxxxxxxx";
    }

    @Override
    public String getAddress() {
        return "家庭住址:xx市xx區xxxxx";
    }

    @Override
    public String getPosition() {
        return "職位:CEO";
    }
}

/**
 * 外部員工接口
 */
public class OuterUser {

    public Map<String, String> getBaseInfo() {
        HashMap<String, String> baseInfo = new HashMap<>();
        baseInfo.put("name", "張三");
        baseInfo.put("phone", "188xxxxxxxx");
        baseInfo.put("address", "xx市xx區");
        return baseInfo;
    }

    public Map<String, String> getOfficeInfo() {
        HashMap<String, String> officeInfo = new HashMap<>();
        officeInfo.put("position", "CEO");
        return officeInfo;
    }
}

/**
 * 適配器類
 */
public class OuterUserInfo implements IUserInfo {

    private OuterUser outerUser;

    public OuterUserInfo(OuterUser outerUser) {
        this.outerUser = outerUser;
    }

    @Override
    public String getUserName() {
        return outerUser.getBaseInfo().get("name");
    }

    @Override
    public String getMobilePhoneNumber() {
        return outerUser.getBaseInfo().get("phone");
    }

    @Override
    public String getAddress() {
        return outerUser.getBaseInfo().get("address");
    }

    @Override
    public String getPosition() {
        return outerUser.getBaseInfo().get("position");
    }
}

/**
 * 測試類
 */
public class Test {

    public static void main(String[] args) {

        ArrayList<IUserInfo> userList = new ArrayList<>();
        OuterUserInfo outerUserInfo = new OuterUserInfo(new OuterUser());
        UserInfo userInfo = new UserInfo();
        userList.add(outerUserInfo);
        userList.add(userInfo);


        for (IUserInfo iUserInfo : userList) {
            System.out.println(iUserInfo.getUserName());
        }


    }
}

結果:
    張三
    李四

結語

適配器模式其實很簡單,但能夠順利實施依賴於整個項目一直很好地遵循着“依賴倒置原則”和“里氏替換原則”。

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