• [디자인패턴]어댑터 패턴(Adapter Pattern)

    2021. 2. 22.

    by. 웰시코더

    반응형

    -디자인 패턴 중 어댑터 패턴에 대해 알아본다.


    어댑터 패턴?

     

    한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 패턴이다.

    인터페이스 호환성이 맞지 않아 같이 사용할 수 없는 클래스를 연관 관계로 연결해서 사용할 수 있게 해주는 패턴이다.

     

    블로그들을 보니 전기 콘센트와 플러그의 예시를 많이 든다. 한국의 가전제품은 220V이다. 110V가 표준인 일본의 제품을 한국에서 사용하기 위해서는 돼지코라는 어댑터가 필요하다. 이런 발상을 기반으로 패턴을 이해하면 도움이 될 것이다. 

     

    어댑터 패턴은 클래스방식객체방식이 있으며 우선 객체방식으로 예제를 만들었다.

     

    예제

     

    어댑터패턴을 활용한 간단한 예제를 만들어 보았다. 기존의 솔루션(OldSoultion) 이후 새로운 솔루션(NewSolution)을 사용하고 있는 시스템이 있다고 가정하자. 그런데 새로운 솔루션 시스템이 너무 불안정하여 기존 솔루션을 임시로 사용하려고 한다. 새로운 솔루션 로직을 수정하지 않고 기존 솔루션을 어댑터(StarterAdapter)를 이용하여 사용해본다.

     

    package Adapter3;
    
    public interface NewSolution {
    	public void start();
    }
    
    package Adapter3;
    
    public class NewSolutionStarter implements NewSolution{
    	@Override
    	public void start() {
    		System.out.println("new 솔루션 스타터 프로그램 시작");
    	}
    }
    
    package Adapter3;
    
    public interface OldSolution {
    	public void start();
    }
    
    package Adapter3;
    
    public class OldSolutionStarter implements OldSolution{
    	@Override
    	public void start() {
    		System.out.println("old 솔루션 스타터 프로그램 시작");
    	}
    }
    

     

    OldSolutionStarter 기능을 NewSolution에서 사용하기 위해 아래와 같은 스타터 어댑터를 만든다.

     

    package Adapter3;
    
    public class StarterAdapter implements NewSolution{
    	private OldSolution oldSolution;
    	
    	public StarterAdapter(OldSolution old) {
    		oldSolution = old;
    	}
    	
    	@Override
    	public void start() {
    		oldSolution.start();
    	}
    
    }
    
    package Adapter3;
    
    public class Main {
    	public static void main(String[] args) {
    		NewSolution newStart = new NewSolutionStarter();
    		newStart.start();
    		
    		NewSolution newStart2 = new StarterAdapter(new OldSolutionStarter());
    		newStart2.start();
    	}
    }
    
    //실행결과
    //new 솔루션 스타터 프로그램 시작
    //old 솔루션 스타터 프로그램 시작
    

     

    Java에서 사용된 어댑터 패턴 - InputStreamReader

     

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public BufferedReader(Reader in) {
        this(in, defaultCharBufferSize);
    }
    public final static InputStream in = null;

     

    우선 InputStream은 바이트 스트림을 읽어들이고 BufferedReader는 캐릭터인풋 스트림을 읽어들인다.

     

    System.in은 InputStream 타입을 반환한다. 하지만 BufferedReader 생성자를 보면 Reader 타입을 받게 된다. BufferedReader의 생성자로 System.in을 그대로 받을 수는 없다. 타입이 맞지 않기 때문이다. 이를 위해 중간에 InputStreamReader라는 어댑터가 들어간다.

     

    아래와 같은 UML 구조도를 만들 수 있다.

     

     

     

    자바에서 사용되는 어댑터 패턴 - 스트림

     

     

    출처 : yaboong.github.io/yaboong.github.io/design-pattern/2018/10/15/adapter-pattern/

    반응형

    댓글