適配器模式屬於結構型模式,旨在將一個類的介面轉換成客戶端期望的另一個介面,使原本不兼容的類能夠協同工作。核心角色:
適配器繼承 Adaptee 並實現 Target。Java 單繼承限制,適用於 Adaptee 為類且無需多重繼承的場景。
public class SquarePeg { public void insert(String s) { ... } }
public class RoundPeg { public void insertIntoHole(String s) { ... } }
// 適配器繼承 SquarePeg,組合 RoundPeg
public class PegAdapter extends SquarePeg {
private RoundPeg roundPeg;
public PegAdapter(RoundPeg peg) { this.roundPeg = peg; }
@Override public void insert(String str) { roundPeg.insertIntoHole(str); }
}
適配器實現 Target,內部持有 Adaptee 實例。更靈活,可適配 Adaptee 及其子類,符合「組合優於繼承」原則。
public class PegAdapter implements SquarePeg {
private RoundPeg roundPeg;
public PegAdapter(RoundPeg peg) { this.roundPeg = peg; }
public void insert(String str) { roundPeg.insertIntoHole(str); }
}
若需同時適配兩個介面,可實現兩個介口(Java 不支援多重繼承類,但可實現多介面):
public class TwoWayAdapter implements ISquarePeg, IRoundPeg {
private SquarePeg squarePeg;
private RoundPeg roundPeg;
// 兩個構造器分別注入
public void insert(String s) { roundPeg.insertIntoHole(s); }
public void insertIntoHole(String s) { squarePeg.insert(s); }
}
利用反射動態發現類的公共方法,實現運行時適配器選擇,進一步解耦。
下次遇到「介面不兼容」時,先想適配器,別急著改源碼!