Adapter Pattern — Design Patterns

Adapter menerjemahkan satu interface ke interface lain yang diharapkan client. Seperti colokan listrik Eropa → adapter → colokan Indonesia: alatnya sama, cara n

Adapter menerjemahkan satu interface ke interface lain yang diharapkan client. Seperti colokan listrik Eropa → adapter → colokan Indonesia: alatnya sama, cara nyambungnya berbeda.

Problem yang diselesaikan:

Kode kamu dirancang bekerja dengan interface tertentu, tapi class dari library/legacy tidak match. Tiga opsi:

  1. Refactor kode kamu (mahal kalau dipakai banyak tempat)
  2. Refactor library/legacy (sering tidak bisa — pihak ketiga, atau risk breaking change)
  3. Bikin adapter — wrapper tipis yang menjembatani dua interface

Implementasi minimal — wrap axios jadi terlihat seperti fetch:

// Interface yang kode kita harapkan (fetch-style)
async function getUser(http, id) {
  const res = await http(`/api/users/${id}`);
  if (!res.ok) throw new Error(res.status);
  return res.json();
}

// Library axios punya interface berbeda
// axios.get(url) → { data, status, ... }
// tidak ada .ok, .json(), dll

// Adapter: wrap axios agar match interface fetch
function axiosAsFetch(axios) {
  return async (url, options = {}) => {
    const response = await axios.request({
      url,
      method: options.method || "GET",
      headers: options.headers,
      data: options.body,
    });
    return {
      ok: response.status < 400,
      status: response.status,
      json: async () => response.data,
      text: async () => JSON.stringify(response.data),
    };
  };
}

// Sekarang getUser bisa dipakai dengan axios maupun fetch asli
const http = axiosAsFetch(axios);
const user = await getUser(http, 42);

Kode domain (getUser) tidak perlu tahu axios ada. Adapter yang jembatani.

Object adapter vs class adapter:

Default di JS: selalu object adapter.

Dunia nyata di ekosistem JS:

Adapter vs Facade vs Decorator — tipis perbedaannya:

Kalau niatnya "aku punya X tapi butuh Y" → Adapter. Kalau "aku mau sembunyikan kompleksitas" → Facade.

Kapan pakai:

Kapan JANGAN pakai:

Trade-off:

Adapter hebat untuk interop, tapi tiap adapter adalah layer tambahan yang harus di-maintain. Kalau dependensi berubah API, adapter yang pertama rusak. Pakai dengan sadar.

Yang akan kamu pelajari