[디자인패턴]3.어댑터패턴

송송승현's avatar
Nov 13, 2024
[디자인패턴]3.어댑터패턴

정의

💡
서로 호환되지 않는 인터페이스를 가진 클래스들을 연결하여 함께 동작하게 만드는 구조적 디자인 패턴임. 기존 코드의 변경 없이 새로운 클래스와 통합 가능
클라이언트가 기대하는 인터페이스와 실제 사용할 클래스의 인터페이스를 맞추기 위해 사용

어댑터 패턴 적용 전 코드

public class Cat { String name = "고양이"; public String getName(){ return name; } } public class Mouse { String name = "쥐"; public String getName(){ return name; } } public class Doorman { public void 쫒아내(Cat cat){ System.out.println(cat.getName()+" 쫓아내"); } } public class App { public static void main(String[] args) { Doorman doorman = new Doorman(); Cat cat = new Cat(); doorman.쫒아내(cat); } }

어댑터 패턴 적용 후 코드

abstract class Animal { abstract String getName(); } public class Cat extends Animal { String name = "고양이"; public String getName(){ return name; } } public class Mouse extends Animal { String name = "쥐"; public String getName(){ return name; } } public class OuterTiger { private String fullname = "호랑이"; public String getFullname(){ return fullname; } } public class TigerAdapter extends Animal{ private String name; public TigerAdapter(OuterTiger tiger) { this.name = tiger.getFullname(); } @Override public String getName() { return name; } } public class App { public static void main(String[] args) { Doorman doorman = new Doorman(); Mouse mouse = new Mouse(); Cat cat = new Cat(); OuterTiger tiger = new OuterTiger(); TigerAdapter tr = new TigerAdapter(tiger); doorman.쫒아내(tr); doorman.쫒아내(mouse); doorman.쫒아내(cat); } }

구성

  • 타깃(Target): 클라이언트가 사용하고자 하는 인터페이스
  • 어댑티(Adaptee): 기존 인터페이스를 가진 클래스
  • 어댑터(Adapter): 타깃 인터페이스를 구현하고, 어댑티의 기능을 호출하는 클래스
  • 클라이언트(Client): 타깃 인터페이스를 통해 어댑티를 사용
 

장점

  • 호환성 향상 : 기존 클래스와 호환되지 않는 클래스들을 함께 사용 가능
  • 재사용성 증가 : 기존 클래스의 재사용성을 향상시킴
  • 단일 책임 원칙 준수(SRP) : 별도의 클래스로 구현되므로, 기존 클래스의 책임을 변경하지 않고도 기능을 확장시킴
  • 오픈/클로즈드 원칙 준수(OCP) : 기존 코드를 수정하지 않고 기능을 추가할 수 있어, 오픈/클로즈드 원칙(OCP)을 준수

단점

  • 복잡성 증가 : 클래스 수가 증가하여 시스템의 복잡성이
  • 성능 저하 가능성 : 어댑터를 통해 호출이 이루어지므로, 직접 호출하는 것보다 성능이 약간 저하될 수 있음
  • 코드 가독성 저하 : 클래스 간의 관계가 복잡해져 코드 가독성이 떨어질 수 있음
  • 디버깅 어려움 : 중간에 어댑터가 끼어들어 디버깅이 어려울 수 있음. 디버깅 시 어댑터 내부의 로직을 파악해야 할 때가 생김
 
 
Share article

송승현의 블로그