-
[java] 디자인패턴 - AdapterJAVA 2021. 8. 11. 23:59
Adapter 정의
어댑터 패턴은 이름대로 어댑터처럼 사용되는 패턴이다. 220V 를 사용하는 한국에서 쓰던 기기들을, 어댑터를 사용하면 110V 를 쓰는곳에 가서도 그대로 쓸 수 있다. 이처럼, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해주는 패턴이 어댑터 패턴이라고 할 수 있겠다.
Client
써드파티 라이브러리나 외부시스템을 사용하려는 쪽이다.Adaptee
써드파티 라이브러리나 외부시스템을 의미한다.Target Interface
Adapter 가 구현(implements) 하는 인터페이스이다. 클라이언트는 Target Interface 를 통해 Adaptee 인 써드파티 라이브러리를 사용하게 된다.Adapter
Client 와 Adaptee 중간에서 호환성이 없는 둘을 연결시켜주는 역할을 담당한다. Target Interface 를 구현하며, 클라이언트는 Target Interface 를 통해 어댑터에 요청을 보낸다. 어댑터는 클라이언트의 요청을 Adaptee 가 이해할 수 있는 방법으로 전달하고, 처리는 Adaptee 에서 이루어진다.클라이언트에서는 Target Interface 를 호출하는 것 처럼 보인다. 하지만 클라이언트의 요청을 전달받은 (Target Interface 를 구현한) Adapter 는 자신이 감싸고 있는 Adaptee 에게 실질적인 처리를 위임한다. Adapter 가 Adaptee 를 감싸고 있는 것 때문에 Wrapper 패턴이라고도 불린다.
어댑터 패턴 사용예제
역할 클래스or인터페이스 Client AdapterDemo Target Interface WebRequester Adapter WebAdapter Adaptee FancyRequester Client
public class AdapterDemo { public static void main(String[] args) { WebAdapter adapter = new WebAdapter(new FancyRequester()); WebClient client = new WebClient(adapter); client.doWork(); } }
FancyRequester 가 동작하는 것을 확인할 수 있다.
Target Interface
public interface WebRequester { void requestHandler(); }
구현체를 가지지 않고 requestHandler() 메소드에 대한 정의만 되어있다.
Adapter
public class WebAdapter implements WebRequester { private FancyRequester fancyRequester; public WebAdapter(FancyRequester fancyRequester) { this.fancyRequester = fancyRequester; } @Override public void requestHandler() { fancyRequester.fancyRequestHandler(); } }
Target Interface 인 WebRequester 인터페이스를 구현.
인스턴스 생성시 adaptee 인 FancyRequester 클래스를 주입한다.
Adaptee
public class FancyRequester { public void fancyRequestHandler() { System.out.println("Yay! fancyRequestHandler is called!"); } }
출처: https://niceman.tistory.com/141
출처2: https://yaboong.github.io/design-pattern/2018/10/15/adapter-pattern/
'JAVA' 카테고리의 다른 글
[mybatis] 스코프와 생명주기 (0) 2021.08.12 [mybatis] Mapper xml의 쿼리문과 매핑 원리 (0) 2021.08.12 [mybatis] Persistence Framework (0) 2021.08.11 jsp:액션태그,우편번호API (0) 2021.08.10 [spring] tiles: 동적배치 (0) 2021.08.10