Java 디자인 모드의 어댑터 모드(Adapter 모드) 소개
어댑터 모드를 사용하는 이유
우리는 두 개의 상관없는 클래스를 조합해서 사용해야 하는 것을 자주 만난다. 첫 번째 해결 방안은 각자의 클래스의 인터페이스를 수정하는 것이다. 그러나 만약에 우리가 원본 코드가 없거나 하나의 응용 프로그램을 위해 각자의 인터페이스를 수정하고 싶지 않다.어떡하지?
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 방법을 동적으로 발견할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.