Menurut
Gang of Four, Adapter patter digunakan untuk mengkonversi nama nama fungsi dan
nama agar cocok dengan yang diinginkan oleh client (kelas yang akan
menggunakan). Adapter memungkinkan kelas untuk bisa bekerja bersama sama
walaupun sebelum tidak memungkinkan Karen a perbedaan nama nama fungsi dan
variabel.
Konteks :
-
Diinginkan untuk menggunakan suatu class dengan
antar muka (method-method public) tertentu tanpa mengubah definisi class
tersebut. Class ini kita sebut adaptee.
-
Konteks permasalahan dimana kita ingin menggunakan
class ini membutuhkan antar muka yang berbeda dari yang dimiliki class
adaptee.Antarmuka yang diperlukan untuk kita sebut target.
-
Antarmuka untuk target dan antarmuka yang dimiliki
adaptee secara konsep berkaitan.
Solusi :
-
Antarmuka yang dibutuhkan client(target)
didefinisikan sebagai interface dengan method-method yang dibutuhkan untuk
menyelesaikan tugas.
-
Definisikan sebuah class adapter yang
mengimplementasikan interface target ini.
-
Class adapter memiliki referensi terhadap objek
adaptee (relasi compose a.k.a HAS_A).class adapter menerjemahkan
method yang dideklarasikan pada interface target ke dalam method dari
adaptee.
-
Client membungkus objek adaptee ke dalam objek
adapter. Client melaksanakan tugasnya dengan memanggil method adapter, dan
adapter menerjemahkannya dengan memanggil method adaptee yang bersesuaian.
Desain umum class diagram Adapter :
Studi Kasus
Misalkan
kita telah memiliki sebuah kelas lingkaran dalam desain aplikasi existing. Pada
tahapan berikutnya muncul beberapa kelas baru yang yang hamper sejenis seperti
garis, titik dan segiempat. Garis titik dan segiempat merupakan
mengimplementasikan interface bidang_datar. Garis titik dan segiempat menshare
beberapa fungsi seperti : tampil(), aturwarna(), sembunyikan(). Ketinya
merupakan turunan dari kelas bidangdatar.
Kelas
lingkaran merupakan kelas existing yang sebenarnya bukan turunan dari kelas
bidang_datar karena pada saat kelas lingkaran ini dibuat kelas bidang_datar juga
belum ada. Celakanya adalah kelas
lingkaran ini telah memiliki beberapa fungsi yang mirip tetapi namanya lain
misal untuk menampilkan nama fungsinya display(), menyembunyikan hide() dan
mengeset warna setcolor()
Pada
tahap ini ada 2 solusi yang mungkin bisa dilakukan :
·Mengubah isi
kelas lingkaran dengan mengubah kelas lingkaran menjadi turunan dari kelas
bidang_datar dan mengubah nama nama fungsi milik lingkaran sesuai dengan nama
nama fungsi yang telah dideklarasikan di kelas bidang_datar sebagai induknya.
Solusi ini merupakan pilihan yang buruk karena 2 hal,
·pertama karena
belum tentu kita mendapatkan source code kelas lingkaran.
·Kedua karena
mengunah kode program selalu menghasilkan error baru, ingat bahwa kelas
lingkaran adalah kelas eksisting yang barangkali sudah ada kelas lain yang
menginstansiasi dan memanggil fungsi fungsi asli milik kelas ini sehingga
ketika diganti mungkin akan menimbulkan error di berbagai tempat lain kode
program kita.
·Membuat sebuah
kelas baru yang merupakan implementasi dari kelas bidang_datar, kelas ini dapat
mewakili kelas lingkaran misalkan diberi nama lingkaran_new. Lingkaran_new
sebagai turunan dari kelas bidang_datar akan mewarisi semua fungsi milik
bidang_datar yaitu : tampil(), aturwarna() dan sembunyikan(). Agar kelas ini dapat memanfaatkan semua
resource (kode program) yang telah ada di kelas lingkaran asli (existing) maka
di buat kelas ini memiliki salah satu atribut yang bertipe lingkaran. Isi
fungsi tampil adalah mengeksekusi fungsi display milik kelas lingkaran yang
asli demikian juga dengan fungsi fungsi yang lain.
Perhatikan
desain di bawah ini :
Solusi
menggunakan adapter pattern :
Kode
Program
public class
main {
private bidang_datar mbidang_datar;
public main () {
mbidang_datar = new Adapter();
mbidang_datar.setwarna();
mbidang_datar.tampil();
mbidang_datar.sembunyi();
mbidang_datar = new segi4();
mbidang_datar.setwarna();
mbidang_datar.tampil();
mbidang_datar.sembunyi();
}
}
public class lingkaran {
public lingkaran () {
}
public void display () {
}
public void setcolor () {
}
public void hide () {
}
public void specificRequest () {
}
}
public class Adapter implements
bidang_datar {
private lingkaran mlingkaran;
public void request () {
}
public void tampil () {
mlingkaran.display();
}
public void sembunyi () {
mlingkaran.hide();
}
public void setwarna () {
mlingkaran.setcolor();
}
}