"Helo, Amigo! Hari ini saya akan memberitahu anda apa sebenarnya « penyesuai » itu. Saya harap selepas mempelajari topik ini anda akan mendapat pemahaman yang lebih baik tentang aliran input/output."

Penyesuai - 1

Bayangkan program anda menggunakan dua rangka kerja yang ditulis oleh pengaturcara/syarikat lain. Kedua-dua rangka kerja adalah sangat baik dan menggunakan prinsip OOP: abstraksi, polimorfisme, enkapsulasi. Bersama-sama, mereka hampir merangkumi sepenuhnya perkara yang perlu dilakukan oleh program anda. Anda tinggal dengan tugas yang mudah. Anda perlu menghantar objek yang dibuat oleh satu rangka kerja ke rangka kerja yang lain. Tetapi kedua-dua rangka kerja adalah berbeza sama sekali dan "tidak tahu tentang satu sama lain", iaitu mereka tidak mempunyai sebarang kelas yang sama. Anda perlu menukar objek satu rangka kerja menjadi objek yang lain.

Tugas ini boleh diselesaikan dengan indah dengan menggunakan teknik « penyesuai » (corak reka bentuk):

kod Java Penerangan
class MyClass implements Interface2
{
 private Interface1 object;
 MyClass(Interface1 object)
 {
  this.object = object;
 }
// This is where we put the Interface2 methods 
// that call Interface1 methods
}
Ini mencerminkan corak reka bentuk penyesuai.

Idea asas ialah kelas MyClass menukar (menyesuaikan) satu antara muka kepada yang lain.

"Bolehkah anda memberi saya contoh yang lebih spesifik?"

"OK. Katakan setiap rangka kerja mempunyai antara muka "senarai" uniknya sendiri. Ia mungkin kelihatan seperti ini:"

kod Java Penerangan
interface AlphaList
{
 void add(int value);
 void insert(int index, int value);
 int get(int index);
 void set(int index, int value);
 int count();
 void remove(int index);
}
Kod daripada rangka kerja pertama ( Alpha ) .

AlphaList ialah salah satu antara muka yang membenarkan kod rangka kerja berinteraksi dengan kod yang menggunakan rangka kerja.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
Pengurus AlphaList AlphaListManager ialah kelas dalam rangka kerja. Kaedah createListnya menciptaobjek AlphaList
interface BetaList
{
 int getValue(int index);
 void setValue(int index, int value);
 int getSize();
 void setSize(int newSize);
}
class BetaSaveManager
{
 public static void saveList(BetaList list)
 {
  //some code to save a BetaList object
  //to a file on disk
 }
}
Kod daripada rangka kerja kedua ( Beta ).

BetaList ialah salah satu antara muka yang membenarkan kod rangka kerja berinteraksi dengan kod yang menggunakan rangka kerja.

BetaSaveManager ialah kelas dalam rangka kerja. Kaedah saveListnyamenyimpanobjek BetaList

class ListAdapter implements BetaList
{
 private AlphaList list;
 ListAdapter(AlphaList list)
 {
  this.list = list;
 }

 int getValue(int index)
 {
  return this.list.get(index);
 }

 void setValue(int index, int value)
 {
  this.list.set(index, value);
 }

 int getSize()
 {
  return this.list.count();
 }

 void setSize(int newSize)
 {
  if (newSize > this.list.count()
  {
   while (this.list.count() < newSize)
  {
   this.list.add(null);
  }
 }
 else if (newSize < this.list.count() {
   while (this.list.count() > newSize)
   {
    list.remove(list.count() - 1);
   }
  }
 }
}
Kelas «Penyesuai» yang menukar daripada antara muka AlphaList kepada antara muka BetaList

Kelas ListAdapter melaksanakan antara muka BetaList daripada rangka kerja kedua.

Apabila seseorang memanggil kaedah ini, kod kelas «ke hadapan» panggilan ke pembolehubah senarai , yang merupakan AlphaList daripada rangka kerja pertama.

Objek AlphaList dihantar kepada pembina ListAdapter

Kaedah setSize beroperasi mengikut peraturan berikut: jika saiz senarai mesti ditambah, tambah item kosong (null). Jika saiz senarai perlu dikecilkan, padamkan item pada penghujungnya.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Contoh bagaimana ia boleh digunakan

"Saya paling suka contoh terakhir anda. Sangat ringkas dan boleh difahami."