구조 패턴: 어댑터 패턴

xellos·2022년 4월 2일
0

디자인 패턴

목록 보기
6/20

소개

  • 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴이다.
  • 클라이언트가 사용하는 인터페이스를 따르지 않는 기존 코드를 변경하지 않고 재사용할 수 있게 해준다.

위의 이미지를 기준으로 설명하면 아래와 같다.
1. Target: 새로운 인터페이스 규격(클라이언트가 사용하며 구체 클래스에 의존하지 않는다)
2. Adaptee: 기존의 코드
3. Adapter: 기존의 코드를 새로운 인터페이스 규격에 맞추기 위한 클래스

1) 장점

  1. 기존 코드를 변경하지 않고 원하는 인터페이스 구현체를 만들어 재사용할 수 있다.
  2. 기존 코드가 하던 일과 특정 인터페이스 구현체로 변환하는 작업을 각기 다른 클래스로 분리하여 관리할 수 있다.

2) 단점

  1. 새 클래스가 생겨서 복잡도가 증가할 수 있다.
  2. 경우에 따라서는 기존 코드가 해당 인터페이스를 구현하도록 수정하는것이 더 좋은 선택일 수 있다.

구현

어댑터 패턴은 프린터기 예제가 가장 이해하기 쉽기 때문에 여기에서는 프린터기를 예로 코드를 작성한다.

1) 기존 클래스: Adaptee

Lg

public class Lg {
	private String text;
    
    public Lg(String text) {
    	this.text = text;
    }
    
    public String printColorText() {
    	return text;
    }
}

Samsung

public class Samsung {
	private String data;
    private String color;
    
    public Samsung(String data, String color) {
    	this.data = data;
        this.color = color;
    }
    
    public String printColorText() {
    	return "[" + color + "]:" + data;
    }
    
    public String getData() {
    	return data;
    }
}

2) 컴퓨터에서 사용할 인터페이스 정의

public interface Printer {
	String printColor();
    String printGrey();
}

3) 어댑터 정의

LgAdapter

public class LgAdapter implements Printer {
	private Lg lg;
    
    public LgAdapter(Lg lg) {
    	this.lg = lg;
    }
    
    @Override
    public String printColor() {
    	return "[검정]: " + lg.printColorText();
    }
    
    @Override
    public String printGrey() {
    	return "[흑백]: " + lg.printColorText();
    }
}

SamsungAdapter

public class SamsungAdapter implements Printer {
	private Samsung samsung;
    
    public SamsungAdapter(Samsung samsung) {
    	this.samsung = samsung;
    }
    
   	@Override
    public String printColor() {
    	return samsung.printColorText();
    }
    
    @Override
    public String printGrey() {
    	return "[흑백]: " + samsung.getData();
    }
}

사용

기존의 클래스를 어댑터에서 새로운 규격게 맞게 사용할 수 있게 만들어 둔 덕분에 컴퓨터는 프린터의 제조사에 상관 없이 아무 프린터기나 사용할 수 있다.

public class Computer {
	private Printer printer;
    
    public Computer(Printer printer) {
    	this.printer = printer;
    }
    
    public void usePrinter() {
    	String colorText = printer.printColor();
        System.out.println("colorText = " + colorText);
        
        String greyText = printer.printGrey();
        System.out.println("greyText = " + greyText);
    }
    
    public static void main(String[] args) {
    	Lg lg = new Lg("보고서");
        LgAdapter lgAdapter = new LgAdapter(lg);
        
        Samsung samsung = new Samsung("긴급 메시지", "적색");
        SamsungAdapter samsungAdapter = new SamsungAdapter(samsung);
        
        Computer window1 = new Computer(lgAdapter);
        window1.usePrinter();
        
        Compter window2 = new Computer(samsungAdapter);
        window2.usePrinter();
    }
}

0개의 댓글