"안녕하세요, Amigo! 오늘은 정확히 « 어댑터 » 가 무엇인지 알려드리겠습니다 . 이 주제에 대해 학습한 후 입력/출력 스트림을 훨씬 더 잘 이해하게 되기를 바랍니다."

어댑터 - 1

귀하의 프로그램이 다른 프로그래머/회사에서 작성한 두 가지 프레임워크를 사용한다고 상상해 보십시오. 두 프레임워크 모두 매우 훌륭하며 추상화, 다형성, 캡슐화와 같은 OOP 원칙을 사용합니다. 프로그램이 수행해야 하는 작업을 거의 완벽하게 다룹니다. 간단한 작업이 남았습니다. 한 프레임워크에서 생성된 개체를 다른 프레임워크로 전달해야 합니다. 그러나 두 프레임워크는 완전히 다르며 "서로에 대해 알지 못합니다". 즉, 공통 클래스가 없습니다. 어떻게든 한 프레임워크의 개체를 다른 프레임워크의 개체로 변환해야 합니다.

이 작업은 « 어댑터 » 기술(디자인 패턴)을 적용하여 아름답게 해결할 수 있습니다 .

자바 코드 설명
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 클래스가 한 인터페이스를 다른 인터페이스로 변환(적응)한다는 것입니다.

"좀 더 구체적인 예를 들어주실 수 있나요?"

"좋아요. 각 프레임워크에 고유한 "목록" 인터페이스가 있다고 가정해 보겠습니다. 다음과 같이 보일 수 있습니다."

자바 코드 설명
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);
}
첫 번째( Alpha ) 프레임워크 의 코드

AlphaList는 프레임워크 코드가 프레임워크를 사용하는 코드와 상호 작용할 수 있도록 하는 인터페이스 중 하나입니다.

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는 프레임워크 코드가 프레임워크를 사용하는 코드와 상호 작용할 수 있도록 하는 인터페이스 중 하나입니다.

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 인터페이스 로 변환하는 «Adapter» 클래스

ListAdapter 클래스는 두 번째 프레임워크에서 BetaList 인터페이스 구현합니다 .

누군가 이러한 메서드를 호출하면 클래스 코드는 첫 번째 프레임워크의 AlphaList목록 변수 에 대한 호출을 «전달»합니다 .

AlphaList 개체 가 ListAdapter 생성자 에 전달됩니다.

setSize 메서드는 다음 규칙에 따라 작동합니다. 목록의 크기를 늘려야 하는 경우 빈(null) 항목을 추가합니다 . 목록의 크기를 줄여야 하는 경우 마지막에 항목을 삭제하십시오.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
사용 방법의 예

"나는 당신의 마지막 예가 가장 마음에 들었습니다. 매우 간결하고 이해하기 쉽습니다."