Search results for 'Adapter'

구조(Structural) 패턴 - Adapter

2007/05/19 15:58
어댑터 패턴은 어떤 클래스의 인터페이스 프로그래밍을 다른 클래스로 변환할 때 사용. 우리는 어댑터를 하나의 프로그램에서 함께 작업하는 클래스간에 서로 관련성이 없게 하고자 할 때 사용. 어댑터의 개념은 그러므로 간단; 우리는 요구되는 인터페이스를 갖는 클래스를 작성하고 다른 인터페이스를 갖는 클래스와 통신할 수 있게 함.
 어댑터를 구현하는 방법에는 상속에 의한 방법과 객체 조합에 의한 방법이 있음. 첫번째 경우에서, 우리는  상속 받는 새로운 클래스를 만들고 요구되는 인터페이스에 매치되는 상속받은 새로운 클래스를 만들기 위해 필요로 하는 메소드를 추가. 다른 방법은 새로운 클래스 내부에 원본의 클래스를 포함하는 방법이고 새로운 클래스 내부에서 호출되는 변환하기 위한 메소드를 생성.

1. 의도
클래스의 인터페이스를 클라이언트가 필요로 하는 형태의 인터페이스로 벼환. 어댑터 패턴은 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함깨 동작 시킴.

2. 고려해야 할 사항
  • 현재 사용하고 있는 콤포넌트가 제공하고 인터페이스와 다른 형태의 인터페이를 제공하고 있는 콤포넌트를 사용하고자 하는 경우 클러이언트쪽을 수정할 경우 클라이언트를 더 복잡하게 만들 수 있음.
  • 또한, 이 클래스가 폴리모피즘을 이용해 다른 클래스를 사용하고 잇을 때 현재 사용하고 잇는 인터페이스를 다른 인터페이스를 사용하도록 수정할 경우 문제가 발생할 수 있음.
  • 사용하고자 하는 클래스가 제공하는 잇는 인터페이스가 원하는 형태의 인터페이스가 아닐 경우, 이 클래스를 수정할 수있음. 그러나, 이 클래스가 다른 위치에서 사용되고 있을 경우, 이것은 동일한 기능을 제공하지만 제공하는 인터페이스가 다른 두가 버전의 클래스를 관리해야 함.
  • 복사-붙이기 방식을 이용 또는 많은 양의 코드를 재작성 하는 방식으로 기존 코드를 재사용하는 것은 좋은 방법이 아니고, 유지보수 비용이 증가하는 문제가 발생.
3. 구조
사용자 삽입 이미지

Library3SearchEngineAdapter.java (Object Adapter를 이용한 해결) (Language : java)
  1. import java.util.ArrayList;
  2.  
  3. public class Library3SearchEngineAdapter implements Searchable {
  4.    private Library3SearchEngine adaptee = new Library3SearchEngine();
  5.    public ArrayList searchByAuthor(String author) {
  6.       // “작가”를 기준으로 한 검색 수행동작을 구현합니다.
  7.       return results;
  8.    }
  9.  
  10.    public ArrayList searchByCallNumber(String callNum) {
  11.       return adaptee.searchByCallNumber(callNum);
  12.    }
  13.  
  14.    public ArrayList searchByTitle(String title) {
  15.       char t[] = title.toCharArray();
  16.       return adaptee.titleSearch(t);
  17.    }
  18. }

4. 자바 프로그래밍 언어에서의 사용 예
  • Java API는 당장 사용할 수 있는 어떠한 고용 어뎁터 객체도 포함하지 않고 있음. 다만, java.awt.event.WindowAdapter와 같은 직접적으로 시용되기 보다는 간접적으로 상속받아 사용될 수 있게 하기위한 클래스를 포함하고 있음.
5. 결과
  • 장점
    클라이언트 클래스는 추가 수정 없이 다른 인터페이스를 제공하는 콤포넌트를 사용할 수 있음.
    Adaptee 클래스는 수정되지 않음.
    Class Adapter 전략 사용시, 하나의 오브젝트만 사용하기 때문에, 또 다른 객체를 생성하거나 클라이언트의 요청을 다른 객체쪽으로 전달하는 것과 같은 동작이 필요없음.
  • 담점
    오브젝트를 추가적으로 생성해야함.
    클라이언트의 모든 요청을 다른 객체에게 던달해야 하기 때문에, 약간 오베헤드가 증가.
    Object Adapter 전략 사용시 Adaptee 클래스이 행위를 재정의하는 것은 어려움.
    자바 프로그래밍 언어에서는 단일 상속만 가능. 따라서 Class Adapter 전략 사용이 어려울 수 있음.
이올린에 북마크하기

happyness Programming/J2EE Patterns , ,

2007/05/19 15:58 2007/05/19 15:58
[로그인][오픈아이디란?]