블링블링 범블링

어댑터 패턴(Adapter Pattern) 본문

Technology/객체 지향 디자인 패턴

어댑터 패턴(Adapter Pattern)

뻠스키 2018. 4. 18. 11:30

어댑터패턴(Adapter Pattern)



어댑터패턴(Adapter Pattern)은 우리가 주변에서 본 어댑터 기능을 생각하면된다. 사용하려는 물건과 코드가 맞지않은 경우 어댑터를 통해 코드를 변화시켜준다. 이처럼 어탭터 패턴은 서로 다르게 구현된 인터페이스를 사용하려는 다른 인터페이스로 변환하는 것을 말한다. 두 개의 인터페이스가 다른 경우 한 쪽의 인터페이스에 맞춰서 하나로 만들어 사용하게 하는 구조다. 


어댑터 패턴은 두 가지로 나뉘는데 하나는 객체를 내부에 선언해 사용하는 객체 어댑터패턴이고, 다른 하나는 인터페이스를 상속받아 사용하는 클래스 어댑터패턴이 있다. 클래스 어댑터패턴은 다중상속이 필요한데 자바에서는 클래스의 다중상속을 지원하지 않는다. 따라서 클라이언트가 인터페이스가 아닌 일부 구현이 필요한 추상클래스라면 자바에서는 클래스어댑터 구현에 제약이 따른다.


객체 어댑터패턴을 예시를 만들어 보았다. 특정 프로그램에서 로그인을 해야할 때 해당 프로그램을 가입한 적이 없어 다른 방법으로 로그인을 하고 싶다. 

이 프로그램에는 로그인 서비스가 프로그램의 회원 로그인말고도 sns 로그인 방법이 있어서 sns계정으로 로그인을 하고 싶다. 해당 프로그램에서 로그인서비스 인터페이스에 맞춰서 sns으로도 로그인 할 수 있도록 어댑터패턴을 적용해서 설계를 해봤다. (본 예시는 실제 구현과는 다를 수 있다.)


[클래스 다이어그램]



계략적으로 표현해서 허술할 수 있지만, 클라이언트가 로그인서비스를 요청했을 때 sns로그인 서비스라면 sns어댑터를 통해서 sns계정으로 로그인할 수 있도록 설계한 것이다. 


[소스코드]

[Adapter Interface : loginService]

1
2
3
public interface loginService { //adapter 인터페이스
    public void login(int type, String id, String password);
}

[ConcreteAdapter Class : LoginServiceSns] : 객체 어댑터

1
2
3
4
5
6
7
8
9
10
11
12
public class LoginServiceSns implements loginService {//concrete adapter(객체 어댑터)
     
    private Snslogin login = new Snslogin();
     
    @Override
    public void login(int type, String id, String password) {//본래 프로그램 로그인맞춰주기
        if(type==1)login.accessLogin(id,password); //sns로그인 접근
         
        System.out.println("sns로 로그인하기");
    }
 
}

[Adaptee Class : SNS]

1
2
3
4
5
6
7
public class Snslogin { //adaptee
     
    public void accessLogin(String id, String password) {
        //해당 sns계정일치하면
        System.out.println("sns로그인에 접근하기");
    }
}

어댑터 패턴을 통해서 클라이언트의 수정없이 일반 로그인이 아닌 sns로그인을 구현할 수 있게 되었다. 


실제 어댑터 패턴을 적용한 예로는 SLF4J라는 로깅API다. 다양한 로깅이 있을 때 필요에 따라 선택적으로 사용할 수 있다록 해준다. SLF4J은 인터페이스를 제공하고, 각 로깅 프레임워크를 맞추기 위해 어댑터를 사용하고 있다.

 

그 외에도 게임에서 새로운 버전의 유닛이 생겼을 때 만약, 이전 버전의 유닛과 사냥하는 인터페이스가 달라졌다고 하면, 어댑터 패턴을 적용해 신규와 기존 유닛의 구별없이 같은 인터페이스로 제어할 수 있다.



- 요약 -

Abstract : 추상적인

Factory : 공장

 

 

Abstract Factory : "추상적인 공장"에서는 "추상적인 부품" 조합해서 "추상적인 제품" 만든다.

 

Abstract라는 단어는 '객체 지향' 있어서 "구체적으로 어떻게 구현되고 있는지에 대해서는 생각하지 않고, 인터페이스(API)만을 생각"하는 상태라는 의미

Ex) 추상 메소드(abstract method) 메소드의 본체는 기술되어 있지않고, 이름과 시그니처(인수의 형태와 )만이 정해져 있는 메소드

 

구체적인 메소드의 내용은 잊어버리고, 추상적인 메소드를 사용해서 프로그래밍 하는 의미를 가진 Template Method 패턴(성호), 혹은 Builder 패턴(지영)에서도 다룸..

 

(핵심) 부품의 구체적인 구현에는 주목하지 않고 인터페이스(API) 주목합니다. 그리고 인터페이스(API)만을 사용해서 부품을 조립하고 제품으로 완성

 

 

 

--------------------------------------------------------------------------------------------------------------------

 

예시 1) 엘리베이터를 생각해보자. 많은 구성 부품 모터와 문을 생각해보자. 건물 A에서는 LG 부품이 사용되고, 건물 B에서는 현대, 건물 C에서는 삼성 부품이 사용되고 있더라도 엘리베이터 프로그램의 변경은 최소화할 필요가 있다.



출처 : http://meylady.tistory.com + 내 생각

Comments