책너두 (헤드 퍼스트 디자인 패턴) 20일차 (~283p)
- Book/헤드 퍼스트 디자인 패턴
- 2023. 7. 20.
요약
- 어댑터 패턴과 퍼사드 패턴
- 어댑터 살펴보기
- 객체지향 어댑터 알아보기
- 어댑터 사용 방법 알아보기
- 오리 어댑터 테스트
- 어댑터 패턴 알아보기
- 클라이언트에서 어댑터를 사용하는 방법
- 어댑터 패턴의 정의
- 객체 어댑터와 클래스 어댑터
메모
CHAPTER 07. 적응시키기 : 어댑터 패턴과 퍼사드 패턴
어댑터 살펴보기
- 어댑터 : 한 인터페이스를 다른 인터페이스로 변환해 주는 역할
- ex) 표준 AC 플러그 → AC 전원 어댑터 → 영국식 전원 소켓
객체지향 어댑터 알아보기
- 새로운 업체에서 제공한 클래스 라이브러리를 사용하려고 했는데, 기존 시스템에서 사용하는 인터페이스가 다른 상황임.
- 업체에서 제공받은 클래스를 변경할 수 없는 상태임.
- 새로운 업체에서 사용하는 인터페이스를 기존에 사용하던 인터페이스에 적응시켜 주는 클래스를 만들면 됨. → 어댑터
어댑터 사용 방법 알아보기
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck {
public void quack() {
System.out.println("꽥");
}
public void fly() {
System.out.println("날고 있어요!!");
}
}
- 오리는 꽥꽥 거리고, 날 수 있음.
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("골골");
}
public void fly() {
System.out.println("짧은 거리를 날고 있어요!");
}
}
- 칠면조는 꽥꽥거리지 않고, 골골 거림.
- 날 수는 있지만, 멀리 날지 못함
- Duck 객체를 못쓰고, Turkey 객체를 대신 사용해야 한다면, 인터페이스가 다르기에 Turkey 객체를 바로 사용할 수 없음.
- 어댑터를 만들어야 함.
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
- 우선, 적응시킬 형식의 인터페이스를 구현해야 함.
- 클라이언트에서 원하는 인터페이스를 구현해야 함.
- 기존 형식 객체의 레퍼런스가 필요함.
- 인터페이스에 들어있는 메소드를 모두 구현한다.
오리 어댑터 테스트
- p276 참고
어댑터 패턴 알아보기
- 클라이언트
- 타깃 인터페이스에 맞게 구현되어 있음.
- 어댑터
- 타깃 인터페이스를 구현함.
- 어댑티 인스턴스가 들어있음.
클라이언트에서 어댑터를 사용하는 방법
- 클라이언트에서 타깃 인터페이스로 메소드를 호출해서 어댑터에 요청을 보냄
- 어댑터는 어댑티 인터페이스로 요청을 어댑티에 관한 메소드 호출로 변환함.
- 클라이언트는 호출 결과를 박지만, 중간에 어댑터가 있는 사실은 모름.
어댑터 패턴의 정의
📍 어댑터 패턴(Adapter Pattern) : 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환함. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줌.
- 인터페이스를 변환해 주는 어댑터를 만들면 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있음.
- 클라이언트와 구현된 인터페이스를 분리할 수 있음.
- 변경 내역이 어댑터에 캡슐화되기에 나중에 인터페이스가 바뀌더라도 클라이언트를 바꿀 필요가 없음.
- 클라이언트는 타깃 인터페이스만 볼 수 있음.
- 어댑터에서 타깃 인터페이스를 구현함.
- 어댑터는 어댑티로 구성되어 있음.
- 어댑티를 새로 바뀐 인터페이스로 감쌀 때 객체 구성을 사용함.
- 어댑티의 모든 서브클래스에 어댑터를 쓸 수 있음.
- 모든 요청은 어댑티에 위임됨.
객체 어댑터와 클래스 어댑터
- 어댑터에는 두 종류가 있음.
- 객체 어댑터
- 클래스 어댑터
- 위에서 살펴본 다이어그램은 객체 어댑터임.
- 클래스 어댑터는 다중 상속이 가능해야 함.
- 자바에서는 다중 상속이 불가능하므로 클래스 어댑터 패턴을 쓸 수 없음.
- 클래스 어댑터는 타깃과 어댑티 모두 서브클래스로 만들어서 사용함.
'Book > 헤드 퍼스트 디자인 패턴' 카테고리의 다른 글
책너두 (헤드 퍼스트 디자인 패턴) 22일차 (~304p) (0) | 2023.07.22 |
---|---|
책너두 (헤드 퍼스트 디자인 패턴) 21일차 (~293p) (0) | 2023.07.21 |
책너두 (헤드 퍼스트 디자인 패턴) 19일차 (~271p) (0) | 2023.07.19 |
책너두 (헤드 퍼스트 디자인 패턴) 18일차 (~256p) (0) | 2023.07.18 |
책너두 (헤드 퍼스트 디자인 패턴) 17일차 (~239p) (0) | 2023.07.17 |