"Merhaba Amigo! Bugün size bir « adaptörün » tam olarak ne olduğunu anlatacağım . Umarım bu konuyu öğrendikten sonra giriş/çıkış akışlarını çok daha iyi anlarsınız."

Adaptörler - 1

Programınızın diğer programcılar/şirketler tarafından yazılmış iki çerçeve kullandığını hayal edin. Her iki çerçeve de çok iyidir ve OOP ilkelerini kullanır: soyutlama, polimorfizm, kapsülleme. Birlikte, programınızın yapması gerekenleri neredeyse tamamen kapsarlar. Basit bir görevle kaldınız. Bir çerçeve tarafından oluşturulan nesneleri diğer çerçeveye geçirmeniz gerekir. Ancak her iki çerçeve de tamamen farklıdır ve "birbirlerini bilmezler", yani ortak sınıfları yoktur. Bir çerçevenin nesnelerini bir şekilde diğerinin nesnelerine dönüştürmeniz gerekir.

Bu görev, « adaptör » tekniği (tasarım deseni) uygulanarak güzel bir şekilde çözülebilir :

java kodu Tanım
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
}
Bu, bağdaştırıcı tasarım modelini yansıtır.

Temel fikir, Sınıfım sınıfının bir arabirimi diğerine dönüştürmesi (uyarlaması) şeklindedir.

"Bana daha spesifik bir örnek verebilir misin?"

"Tamam. Diyelim ki her çerçevenin kendi benzersiz "liste" arayüzü var. Şuna benzerler:"

java kodu Tanım
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);
}
İlk ( Alfa ) çerçeveden kod

AlphaList, çerçeve kodunun çerçeveyi kullanan kodla etkileşime girmesini sağlayan arayüzlerden biridir.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager, çerçevede bir sınıftır. CreateList yöntemi bir AlphaList nesnesi
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
 }
}
İkinci ( Beta ) çerçeveden kod.

BetaList , çerçeve kodunun çerçeveyi kullanan kodla etkileşime girmesini sağlayan arayüzlerden biridir.

BetaSaveManager , çerçevede bir sınıftır. saveList yöntemi bir BetaList nesnesinikaydeder

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);
   }
  }
 }
}
AlphaList arayüzünden BetaList arayüzüne dönüştüren «Bağdaştırıcı» sınıfı

ListAdapter sınıfı , ikinci çerçeveden BetaList arabirimini uygular .

Birisi bu yöntemleri çağırdığında, sınıf kodu, çağrıları ilk çerçeveden bir AlphaList olan liste değişkenine "iletiyor".

ListAdapter yapıcısına bir AlphaList nesnesi iletilir

setSize yöntemi aşağıdaki kurallara göre çalışır: listenin boyutunun artırılması gerekiyorsa boş (null) öğeler ekleyin . Listenin boyutunun küçültülmesi gerekiyorsa, sondaki öğeleri silin.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Nasıl kullanılabileceğine dair bir örnek

"En çok son örneğini beğendim. Çok özlü ve anlaşılır."