1. 程式人生 > >適配器模式【結構模式】

適配器模式【結構模式】

ets assert exce apt all otherwise final 環境 無法

適配器模式

Convert the interface of a class into another interface clients except.
Adapter lets classes work together that couldn‘t otherwise because of incompatible interfaces.
將一個類的接口轉換為另一個客戶端所期望的接口。
適配器允許由於接口不兼容而無法一起工作的兩個類可以協同工作。
public class Adapter {
    /**
     * 適配器模式:
     * Convert the interface of a class into another interface clients except.
     * Adapter lets classes work together that couldn‘t otherwise because of incompatible interfaces.
     * 將一個類的接口轉換為另一個客戶端所期望的接口。
     * 適配器允許由於接口不兼容而無法一起工作的兩個類可以協同工作。
     */
    @Test
    public void all() {
        // 需要適配的舊接口實現
        final OldPhone oldPhone = new OldPhone();
        final String phone = oldPhone.getPhones().get(PhoneType.SELF);

        // 適配新舊接口的適配器
        final PhoneAdapter adapter = PhoneAdapter.builder().phone(oldPhone).build();
        // 工作在新接口環境下
        final String selfPhone = adapter.getSelfPhone();
        assertEquals(phone, selfPhone);
    }
}

enum PhoneType {
    SELF, WORK;
}

/**
 * 1)需要適配的目標接口
 */
interface IPhone {
    Map<PhoneType, String> getPhones();
}

/**
 * 2)舊接口的具體實現
 */
class OldPhone implements IPhone {
    private final Map<PhoneType, String> phones = Map.of(PhoneType.SELF, "666", PhoneType.WORK, "123");

    @Override
    public Map<PhoneType, String> getPhones() {
        return phones;
    }
}

/**
 * 3)客戶端期望的接口規範
 */
interface PhoneSRP {
    String getSelfPhone();

    String getWorkPhone();
}

/**
 * 4)將舊接口適配為客戶端期望接口的適配器,適配器持有舊接口的實例
 */
@Builder
class PhoneAdapter implements PhoneSRP {
    private final IPhone phone;

    @Override
    public String getSelfPhone() {
        return phone.getPhones().get(PhoneType.SELF);
    }

    @Override
    public String getWorkPhone() {
        return phone.getPhones().get(PhoneType.WORK);
    }
}

適配器模式【結構模式】