어댑터 패턴은 서로 다른 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중간에 변환기를 제공하는 패턴이다.
즉, 기존 코드의 변경 없이 새로운 인터페이스를 적용하여 클라이언트가 원하는 방식으로 기존 클래스를 사용할 수 있도록 도와준다.
Client -> Target (인터페이스) -> Adapter -> Adaptee (기존 클래스)
// 1. Target 인터페이스
public interface Duck {
void quack();
void fly();
}
// 2. Adaptee 클래스 (기존 클래스)
public class Turkey {
public void gobble() {
System.out.println("Gobble gobble");
}
public void flyShortDistance() {
System.out.println("I fly a short distance");
}
}
// 3. Adapter 클래스 (변환 역할)
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.flyShortDistance();
}
}
}
// 4. 클라이언트 코드
public class AdapterTest {
public static void main(String[] args) {
Duck duck = new TurkeyAdapter(new Turkey());
duck.quack();
duck.fly();
}
}
파사드 패턴은 복잡한 서브시스템을 간단한 인터페이스로 감싸서 사용하기 쉽게 만드는 패턴이다.
즉, 여러 개의 클래스와 복잡한 인터페이스를 하나의 단순한 인터페이스로 통합하여 클라이언트가 쉽게 사용할 수 있도록 도와준다.
Client -> Facade -> Subsystems (서브 시스템들)
// 서브 시스템 클래스들
public class Amplifier {
public void on() { System.out.println("Amplifier on"); }
public void off() { System.out.println("Amplifier off"); }
}
public class DVDPlayer {
public void on() { System.out.println("DVD Player on"); }
public void off() { System.out.println("DVD Player off"); }
public void play(String movie) { System.out.println("Playing " + movie); }
}
public class Projector {
public void on() { System.out.println("Projector on"); }
public void off() { System.out.println("Projector off"); }
}
// 파사드 클래스
public class HomeTheaterFacade {
private Amplifier amp;
private DVDPlayer dvd;
private Projector projector;
public HomeTheaterFacade(Amplifier amp, DVDPlayer dvd, Projector projector) {
this.amp = amp;
this.dvd = dvd;
this.projector = projector;
}
public void watchMovie(String movie) {
System.out.println("Get ready to watch a movie...");
amp.on();
dvd.on();
projector.on();
dvd.play(movie);
}
public void endMovie() {
System.out.println("Shutting movie theater down...");
amp.off();
dvd.off();
projector.off();
}
}
// 클라이언트 코드
public class HomeTheaterTest {
public static void main(String[] args) {
Amplifier amp = new Amplifier();
DVDPlayer dvd = new DVDPlayer();
Projector projector = new Projector();
HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, dvd, projector);
homeTheater.watchMovie("Inception");
homeTheater.endMovie();
}
}
| 패턴 | 목적 | 사용 사례 |
|---|---|---|
| 어댑터 패턴 | 인터페이스 변환 | 서로 다른 인터페이스를 가진 클래스를 통합할 때 |
| 파사드 패턴 | 복잡한 시스템 단순화 | 여러 개의 클래스를 하나의 인터페이스로 묶을 때 |
어댑터 패턴은 인터페이스를 변환하여 호환성을 높이는 역할을 하고, 파사드 패턴은 복잡한 시스템을 단순한 인터페이스로 감싸는 역할을 한다.