Notice
suyeonme
[디자인 패턴] 어댑터 패턴(Adapter Pattern), 퍼사드 패턴(Facade Pattern) 본문
프로그래밍👩🏻💻/디자인 패턴
[디자인 패턴] 어댑터 패턴(Adapter Pattern), 퍼사드 패턴(Facade Pattern)
suyeonme 2022. 7. 11. 22:22헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다.
어댑터 패턴(Adapter Pattern)이란?
특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다.
어댑터 패턴의 특징
- 어댑터를 새로 바뀐 인터페이스로 감쌀 때는 객체 구성(composition)을 사용한다. 이러한 접근법은 어댑티의 모든 서브 클래스에 어댑터를 쓸 수 있다는 장점이 있다.
- 클라이언트를 특정 구현이 아닌 인터페이스에 연결한다. 서로 다른 백엔드 클래스로 변환시키는 여러 어댑터를 사용할 수도 있다. 이렇게 인터페이스를 기준으로 코드를 작성하기에 타깃 인터페이스만 유지한다면 나중에 다른 구현을 추가하는 것이 가능하다.
클라이언트에서 어댑터를 사용하는 방법
- 클라이언트에서 타겟(target) 인터페이스로 메소드를 호출해서 어댑터에 요청을 보낸다.
- 어댑터는 어댑티 인터페이스로 그 요청을 어댑티에 관한 메소드 호출로 변환한다.
- 클라이언트는 호출 결과를 받긴하지만 중간에 어댑터가 있다는 사실을 모른다.
어댑터 패턴 예시
1. 인터페이스 정의
// 원래 인터페이스
public interface Duck {
public void quack();
public void fly();
}
// 어댑터를 적용할 인터페이스
public interface Turkey {
public void gobble();
public void fly();
}
2. Turkey 구상 클래스
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("골골!");
}
public void fly() {
System.out.println("터키 날다!");
}
}
3. 어댑터 클래스 생성
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
turkey.fly();
}
}
4. 어댑터 테스트
public class DuckTest {
public static void main(String[] args) {
Duck duck = new MallardDuck();
Turkey turkey = new Turkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
객체 어댑터(Object Adapter) vs 클래스 어댑터(Class Adapter)
객체 어댑터
- 구성(composition)으로 어댑티에 요청을 전달한다.
- 어댑티 클래스와 그 서브 클래스에 대해서도 어댑터 역할을 할 수 있다.
클래스 어댑터
- 타깃과 어댑티를 모두 서브클래스로 만들어서 요청을 상속(Inheritance)한다.
- 특정 어댑티 클래스에만 적용할 수 있다는 단점이 있다.
- 어댑티 전체를 다시 구현하지않아도 되고 서브 클래스로 어댑티의 행동을 오버라이드할 수 있다는 장점이 있다.
퍼사드 패턴(Facade Pattern)이란?
서브 시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어준다. 또한 고수준 인터페이도 정의하므로 서브 시스템을 더욱 편리하게 사용할 수 있다. 즉 어떤 서브시스템에 속한 일련의 복잡한 클래스를 단순하게 바꿔서 통합한 클래스를 만든다.
* facade는 겉모양, 외관이라는 뜻
퍼사드 패턴 예시
홈시어터를 만든다고 가정해보자. 홈시어터는 아래의 순서대로 작동한다.
- 팝콘 기계를 켠다.
- 팝콘을 튀긴다.
- 조명을 어둡게 조절한다.
- 스크린을 내린다.
- 프로젝터를 켠다.
- 앰프를 켠다.
- 영화를 재생한다.
// 필요한 메소드 목록
popper.on();
popper.pop();
lights.dim(10);
screen.down();
projector.on();
amp.on();
player.play();
1. 퍼사드 클래스 생성
public class HomeTheaterFacade {
Amplifier amp;
Player player;
Projector projector;
Lights lights;
Screen screen;
PopcornPopper popper;
public HomeTheaterFacade(
Amplifier amp,
Player player,
Projector projector,
Lights lights,
Screen screen,
PopcornPopper popper
) {
this.amp = amp;
this.player = player;
this.projector = projector;
this.lights = lights;
this.screen = screen;
this.popper = popper;
}
}
2. 단순화된 인터페이스 생성
public void watchMovie(String movie) {
popper.on();
popper.pop();
lights.dim(10);
screen.down();
projector.on();
amp.on();
player.play();
}
3. 퍼사드 클래스 사용
public class HomeTheater {
public static void main(String[] args) {
HomeTheaterFacade homeTheater = new HomeTheaterFacade(
amp,
player,
projector,
lights,
screen,
popper
);
homeTheater.watchMovie("Dune");
}
}
'프로그래밍👩🏻💻 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴] 상속(Inheritance) vs 조합(Composition) (0) | 2022.07.17 |
---|---|
[디자인 패턴] 최소 지식 원칙(Principle of Least Knowledge) (0) | 2022.07.11 |
[디자인 패턴] 커맨드패턴(Command Pattern) (0) | 2022.07.10 |
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) (0) | 2022.07.04 |
[디자인 패턴] 팩토리 패턴(Factory Pattern) (0) | 2022.06.26 |
Comments