Java 디자인 모드의 어댑터 모드(Adapter 모드) 소개

어댑터 모드 정의: 두 개의 호환되지 않는 클래스를 한데 묶어서 사용합니다. 구조형 모드에 속하며 Adaptee(피적합자)와 Adaptor(어댑터) 두 개의 신분이 필요합니다.
어댑터 모드를 사용하는 이유
우리는 두 개의 상관없는 클래스를 조합해서 사용해야 하는 것을 자주 만난다. 첫 번째 해결 방안은 각자의 클래스의 인터페이스를 수정하는 것이다. 그러나 만약에 우리가 원본 코드가 없거나 하나의 응용 프로그램을 위해 각자의 인터페이스를 수정하고 싶지 않다.어떡하지?
Adapter를 사용하여 두 인터페이스 사이에 혼합 인터페이스(혼혈아)를 만듭니다.
어댑터 모드 사용 방법
Adapter 방식을 실현하는 것은 사실'think in Java'의'클래스 재생'1절에서 두 가지 방식이 언급되었는데 그것이 바로 조합(composition)과 계승(inheritance)이다.
가령 우리가 말뚝을 박으려고 한다면 두 종류가 있는데 그것이 바로 사각형 말뚝의 원형 말뚝이다.

public class SquarePeg{
 public void insert(String str){
  System.out.println("SquarePeg insert():"+str);
 }
}

public class RoundPeg{
 public void insertIntohole(String msg){
  System.out.println("RoundPeg insertIntoHole():"+msg);
    }
}

지금은 네모난 말뚝도 치고 원형 말뚝도 쳐야 하는 응용이 있다.그러면 우리는 이 두 개의 상관없는 클래스를 종합적으로 응용해야 한다. 만약에 RoundPeg가 원본 코드가 없거나 원본 코드를 수정하고 싶지 않다고 가정하면 우리는 Adapter를 사용하여 이 응용을 실현한다.

public class PegAdapter extends SquarePeg{
 private RoundPeg roundPeg;
 public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)
 public void insert(String str){ roundPeg.insertIntoHole(str);}
}
위 코드에서 RoundPeg는 Adaptee에 속하며 어댑터입니다.PegAdapter는 Adaptee(피적합자 RoundPeg)와 Target(대상 SquarePeg)을 맞춤형으로 구성한 Adapter입니다.실제로 이것은 조합 방법(composition)과 계승(inheritance) 방법을 종합적으로 운용하는 것이다.
PegAdapter는 먼저 SquarePeg를 계승한 다음에 new의 조합으로 대상을 생성하는 방식으로 RoundPeg의 대상을 생성하고 상위 insert() 방법을 다시 불러옵니다.여기에서 당신도 new 생성 대상을 사용하는 것과 extends 계승 생성 대상을 사용하는 것이 다르다는 것을 알고 있습니다. 전자는 원래의 클래스를 수정할 필요가 없고 심지어 내부 구조와 원본 코드를 알 필요가 없습니다.
만약 당신이 자바에서 사용한 경험이 있다면, 이미 이러한 모델은 자주 사용된다는 것을 발견할 수 있다.
더욱 사용하다
위의 PegAdapter는 SquarePeg를 계승한 것입니다. 만약에 우리가 양쪽 계승이 필요하다면 SquarePeg를 계승하고 RoundPeg를 계승합니다. 왜냐하면 자바에서 많이 계승하는 것을 허락하지 않지만 우리는 두 개의 인터페이스(interface)를 실현할 수 있습니다.

public interface IRoundPeg{
 public void insertIntoHole(String msg);
}
public interface ISquarePeg{
 public void insert(String str);
}
다음은 새로운 Round Peg와 Square Peg입니다. 인터페이스를 실현하는 것을 제외하고는 위와 다를 것이 없습니다.

public class SquarePeg implements ISquarePeg{
 public void insert(String str){
  System.out.println("SquarePeg insert():"+str);
 }
}

public class RoundPeg implements IRoundPeg{
 public void insertIntohole(String msg){
  System.out.println("RoundPeg insertIntoHole():"+msg);
 }
}

다음은 two-way adapter라는 새로운 PegAdapter입니다.

public class PegAdapter implements IRoundPeg,ISquarePeg{
 private RoundPeg roundPeg;
 private SquarePeg squarePeg;

 //
 public PegAdapter(RoundPeg peg){this.roundPeg=peg;}
 //
 public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)

 public void insert(String str){ roundPeg.insertIntoHole(str);}
}

플러그블 어댑터(Pluggable Adapters)라는 것도 있는데, 몇 개의 어댑터 중 하나를 동적으로 얻을 수 있다.Reflection 기술을 사용하면 클래스의 Public 방법을 동적으로 발견할 수 있습니다.

좋은 웹페이지 즐겨찾기