어댑터 패턴

Dahui Kim·2023년 8월 7일
0

디자인패턴

목록 보기
4/4
post-thumbnail

한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다.
⇒ 인터페이스 호환성 문제로 같이 사용할 수 없는 클래스들을 연결해 쓸 수 있다.

의존성 역전 원칙(DIP)과 개방 폐쇄 원칙(OCP)을 기반으로 하는 디자인 패턴이다. 자바를 기준으로 정리하여 객체 어댑터 패턴에 대한 정보만 기술한다. (클래스 어댑터 패턴은 다중 상속을 지원하는 언어에서 사용이 가능하다)

  • 어댑터 : 기존 코드의 변화 없이 어댑터를 적용하는 것으로 새로운 클래스를 기존에 사용하던 인터페이스에 사용할 수 있게 중개하는 역할을 수행한다.

클래스 다이어그램

  • 클라이언트와 어댑터가 모두 특정 구현이 아닌 인터페이스에 의존하고 있어 DIP를 만족한다는 걸 확인할 수 있다 .
    • Adaptee를 변경하기 위해 Client를 변경할 필요가 없어 OCP를 만족하고 있다.
  • 어댑터 패턴은 클라이언트와 구현된 인터페이스를 분리 ⇒ 인터페이스가 바뀌어도 변경 내역이 어댑터에 캡슐화되어 클라이언트를 변경할 필요가 없어진다.
    • 캡슐화 : 서로 연관이 있는 변수와 메서드를 하나로 묶어 관리하는 것
  • e.g.
    • Client
      	public class Client {
      	public static void main(String[] args) {
      		// TODO Auto-generated method stub
      		Dog dog=new DogAdapter(new GreyWolf());
      		dog.bark();
      		dog.run();
      	}
      }
    • Dog : 인터페이스
      public interface Dog {
      	public void bark();
      	public void run();
      }
    • DogAdapter : Wolf 클래스를 Dog으로 사용하도록 변환해주는 어댑터 클래스
      public class DogAdapter implements Dog {
      	Wolf wolf;
      	public DogAdapter(Wolf wolf) {
      		this.wolf=wolf;
      	}
      	@Override
      	public void bark() {
      		// TODO Auto-generated method stub
      		wolf.howl();
      	}
      
      	@Override
      	public void run() {
      		wolf.walk();
      	}
      	
      }
    • GreyWolf : Client가 Dog에게 원하는 기능을 구현하고 있는 실제 구현 클래스
      public class GreyWolf implements Wolf{
      
      	@Override
      	public void howl() {
      		// TODO Auto-generated method stub
      		System.out.println("Awooooo");
      	}
      
      	@Override
      	public void walk() {
      		// TODO Auto-generated method stub
      		System.out.println("A big walks...");
      	}
      	
      }
profile
긍정적인 생각, 적극적인 생활

0개의 댓글