Adaptor 패턴은
서로 다른 인터페이스를 가진 클래스들을 함께 사용할 수 있도록 하는 패턴이라고 한다.
클래스의 인터페이스를 다른 인터페이스로 변환하여 함께 작동하도록 해준다고 한다.
구조가 다른 Tiger 클래스를 Animal 추상클래스를 이용하여 사용하고 싶을 때,
Tiger 클래스의 구조를 변경할 수 없을 때,
이런 경우에 Animal 클래스를 상속받고, Tiger 객체를 필드로 갖게하여
TigerAdapter 클래스를 정의할 수 있다.
이런식으로 사용하면 User는 Animal을 통해 Tiger 클래스를 사용할 수 있다고 한다.
먼저 Animal 클래스를 정의하는데
필요에 따라 추상클래스가 아니라 인터페이스로 정의할 수도 있다.
하지만 아래 코드에서는 name이라는 필드를 가지고 있기 때문에 추상클래스로 정의한다.
위 Animal 클래스를 상속받는 Dog 클래스를 추가한다.
name은 그대로 전달받고, sound 메소드만 별도로 구현하였다.
동일하게 Animal 클래스를 상속받는 Cat 클래스를 추가한다.
sound 메소드만 다르게 구현한다.
이제 메인 메소드를 구현한다.
ArrayList에 Dog와 Cat 객체들을 추가한다.
그리고 각 객체들의 sound 메소드를 호출한다.
실행하면 각 객체들이 가지고 있는 sound 메소드를 실행하게 된다.
이 때, 변경할 수 없는 Tiger 클래스가 하나 있다고 가정하고 아래와 같이 구현한다.
기존에 구현된 Cat, Dog과 구조가 달라 Animal 클래스를 이용하여 사용할 수가 없는 상태이다.
기존에 생성자를 통해서 name을 초기화하고, sound 메소드를 통해 출력을 했던 것과 달리
Tiger 클래스는 setName 메소드를 통해 name을 초기화하고, roar 메소드를 통해 울음소리만 출력하게 된다.
이러한 경우에 Adapter 패턴을 사용할 수 있는데,
Cat, Dog 클래스와 동일하게 Animal 추상클래스를 상속받고,
필드로 Tiger 타입의 변수를 생성한다.
생성자를 통해 name을 초기화해주는 과정과 동시에
Tiger 변수에 새로운 인스턴스를 생성하고
Tiger 클래스의 setName 메소드를 사용하여
Tiger 인스턴스가 name을 초기화 할 수 있도록 한다.
sound 메소드는 기존의 Cat과 Dog의 결과와 동일하게 출력되도록
포맷을 맞춰준다.
이렇게 하고 메인 메소드에 TigerAdapter를 추가해주면 동일한 혈태의 출력 결과를 얻을 수 있다.
변경할 수 없는 클래스를 원하는 형태의 인터페이스나 클래스로 사용하고자 할 때
아답타 클래스를 도입하여 사용할 수 있다.
해당 글은
https://www.youtube.com/watch?v=7MSzyqhrO-A&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=5
위 유튜브 영상 강의를 듣고 작성하였습니다.
'Design Pattern' 카테고리의 다른 글
디자인 패턴 - 행위(Behavioral)패턴 - Template (0) | 2024.10.10 |
---|---|
디자인 패턴 - 행위(Behavioral)패턴 - Strategy (0) | 2024.10.10 |
디자인 패턴 - 행위(Behavioral)패턴 - Iterator (2) | 2024.10.10 |