ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디자인패턴 (8) - 어댑터 패턴
    언어/디자인패턴 2023. 9. 12. 16:41

    1. 어댑터 패턴이란?

     

    - 클래스를 어댑터로 사용하는 구조 패턴이다.

    - 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들을 함께 작동하도록 변환해주는 역할 

    - 이미 구축되어 있는 것을 새로운 어떤것에 사용할 때 양 쪽 간의 호환성을 유지해 주기 위해 사용하는 것

    - 호환성 및 신규 기능 확장 

     

    2. 어댑터 패턴 구조

     

    - 상속 혹은 합성해서 작업할 수 있다.

     

    2.1 객체 어댑터

     

    - 합성된 맴버에게 위임을 이용한 어댑터 패턴이다.

    - 자기가 해야할 일을 클래스 멤버 객체의 메소드에게 다시 시킴 

    - 합성을 활용하여 런타임 중 어댑터가 결정되어 유연하다.

    - 하지만, Adaptee객체를 필드 변수로 저장해야해서 공간을 차지한다.

     

    참고자료:https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%96%B4%EB%8C%91%ED%84%B0Adaptor-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

     

    - Adaptee : 어댑터 대상 객체 -> 기존 시스템/외부 시스템/ 써드파티 라이브러리

    - Target(Client Interface): Adapter가 구현하는 인터페이스

    - Adapter: Client와 Adaptee 중간에 둘을 연결 

    -Client: 기존 시스템을 어댑터를 통해 사용하려는 쪽 -> Client Interface를 통해 Service 이용

     

    class Service{
    
    	void specificMethod(int spcialData){
         	//서비스 기능 호출 
         }
    }
    
    interface Target{ // Client Interface : 클라이언트가 사용할 고수준 어댑터 모듈
    	void method(int data);
    }
    
    class Adapter implements Target{
    	Service adaptee;
        
        Adapter(Service adaptee){
        this.adaptee = adaptee;
        }
        
        public void method(int data){
        	adaptee.specificMethod(data)//위임 
        }
    
    }
    
    class Client{
    	public static void main(String[] args){
        	Target adapter = new Adapter(new Service());
            adapter.method(1);
        }
    
    }

     

    * 기존 클래스 ->어댑터-> 클래스 

    -> 구성해서 행동 위임하는 걸 한번 더 캡슐화한 느낌..

    -> 기존 클래스 -> 어댑터 인터페이스-> 어댑터 인터페이스 구현체 (행동 위임할 클래스 구성)

    기존 클래스는 어댑터를 통해 다른 클래스 메서드 호출 (행동 위임)

     

    2.2 클래스 어댑터 

     

    - 클래스 상속을 이용한 어댑터 패턴 

    - Adaptee를 상속했음 -> 객체 구현 코드 없이 바로 코드 재사용 가능

    출처:https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%96%B4%EB%8C%91%ED%84%B0Adaptor-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

    class Service{
    	
        void specificMethod(){
        	//
        }
    }
    
    interface Target{
    	void method();
    }
    
    class Adapter extends Service implements Target{
    	public void method(int data){
        	specificMethod();
        }
    }
    
    class Client{
    	public static void main(String[] args){
        
        	Target adapter = new Adapter();
            adapter.method();
        }
    }

     

    3. 어댑터 패턴의 특징

     

    3.1 패턴 사용 시기

     

    - 레거시 코드를 사용하고 싶은데, 새로운 인터페이스가 레거시 코드와 호환 안될 때

    - 이미 만든 것을 재사용하려는데, 재사용 가능한 라이브러리를 수정할 수 없을 때 

    - 이미 만들어진 클래스를 새로운 인터페이스에 맞게 개조할 때

    - 소프트웨어 구버전과 신버전 공존 시키고 싶을 때

     

    3.2 패턴 장점

     

    - 기본 비지니스 로직에서 인터페이스 또는 데이터 변환 코드 분리 ->SRP만족

    - 기존 클래스 코드를 건들지 않고 인터페이스를 통해 어댑터와 작동 -> OCP 만족

    - 추가로 필요한 메서드가 있다면, 어댑터를 빠르게 만들 수 있다.

     

    3.3 패턴 단점

     

     - 새로운 인터페이스 어댑터 클래스 세트로 도입해야함 -> 코드 복잡성 증가

     -  직접 서비스 클래스 변경하는게 더 간단할 때도 있다.

Designed by Tistory.