„Здравей, Амиго! Днес ще ти кажа Howво точно е „ адаптер “. Надявам се, че след като научиш тази тема, ще разбереш много по-добре входно/изходните потоци.“

Адаптори - 1 бр

Представете си, че вашата програма използва две рамки, написани от други програмисти/компании. И двете рамки са много добри и използват ООП принципи: абстракция, полиморфизъм, капсулиране. Заедно те почти напълно покриват това, което вашата програма трябва да направи. Остава ви проста задача. Трябва да предадете обекти, създадени от една рамка, към другата рамка. Но и двете рамки са напълно различни и "не знаят една за друга", т.е. нямат общи класове. Трябва по няHowъв начин да преобразувате обектите на една рамка в обекти на другата.

Тази задача може да бъде красиво решена чрез прилагане на техниката « адаптер » (модел за проектиране):

Java code Описание
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
}
Това отразява модела на проектиране на адаптера.

Основната идея е, че класът MyClass преобразува (адаптира) единия интерфейс към другия.

"Можете ли да ми дадете по-конкретен пример?"

„ОК. Да кажем, че всяка рамка има свой собствен уникален интерфейс „списък“. Те може да изглеждат по следния начин:“

Java code Описание
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);
}
Код от първата ( алфа ) рамка

AlphaList е един от интерфейсите, който позволява на codeа на рамката да взаимодейства с codeа, който използва рамката.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaList Manager AlphaListManager е клас в рамката. Неговият метод createList създаваобект 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
 }
}
Код от втората ( бета ) рамка.

BetaList е един от интерфейсите, който позволява на codeа на рамката да взаимодейства с codeа, който използва рамката.

BetaSaveManager е клас в рамката. Неговият метод saveList записва 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);
   }
  }
 }
}
Клас «Адаптер», който преобразува от интерфейса AlphaList към интерфейса BetaList

Класът ListAdapter имплементира интерфейса BetaList от втората рамка.

Когато някой извика тези методи, codeът на класа „пренасочва“ извикванията към променливата на списъка , която е AlphaList от първата рамка.

Обект AlphaList се предава на конструктора ListAdapter

Методът setSize работи съгласно следните правила: ако размерът на списъка трябва да се увеличи, добавете празни (нулеви) елементи. Ако размерът на списъка трябва да бъде намален, изтрийте елементите в края.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
Пример за това How може да се използва

„Най-много ми хареса последният ти пример. Много кратък и разбираем.“