Adapter 패턴은 서로 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 변환해주는 구조적 패턴이다. 마치 전자기기의 어댑터처럼, 한쪽의 인터페이스를 다른 쪽에서 사용할 수 있는 형태로 맞춰주는 역할을 한다.
두 방식
Printer 인터페이스에 맞는 Adapter인 PrinterAdapter 클래스를 만든다. 내부에서 LegacyPrinter 를 활용하여 print 메서드를 구현한다.
// Target 인터페이스
interface Printer {
void print(String message);
}
// Adaptee (기존 클래스)
class LegacyPrinter {
public void printOldWay(String text) {
System.out.println("Legacy Printer: " + text);
}
}
// Adapter (객체 어댑터 방식)
class PrinterAdapter implements Printer {
private LegacyPrinter legacyPrinter;
public PrinterAdapter(LegacyPrinter legacyPrinter) {
this.legacyPrinter = legacyPrinter;
}
@Override
public void print(String message) {
legacyPrinter.printOldWay(message); // Adaptee의 메서드 호출
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
LegacyPrinter legacyPrinter = new LegacyPrinter();
Printer printer = new PrinterAdapter(legacyPrinter);
printer.print("Hello, Adapter Pattern!"); // 출력: Legacy Printer: Hello, Adapter Pattern!
}
}
Facade 패턴은 복잡한 서브시스템을 단순화된 단일 인터페이스로 감싸서 클라이언트가 쉽게 사용할 수 있게 해주는 구조적 패턴이다. "외관"이라는 뜻처럼, 내부의 복잡성을 숨기고 깔끔한 외부를 제공한다.
// 서브시스템 클래스들
class Audio {
public void turnOn() { System.out.println("Audio On"); }
public void setVolume(int level) { System.out.println("Volume set to " + level); }
public void turnOff() { System.out.println("Audio Off"); }
}
class Light {
public void dim(int level) { System.out.println("Light dimmed to " + level); }
public void turnOff() { System.out.println("Light Off"); }
}
class Projector {
public void turnOn() { System.out.println("Projector On"); }
public void setInput(String input) { System.out.println("Input set to " + input); }
public void turnOff() { System.out.println("Projector Off"); }
}
// Facade 클래스
class HomeTheaterFacade {
private Audio audio;
private Light light;
private Projector projector;
public HomeTheaterFacade(Audio audio, Light light, Projector projector) {
this.audio = audio;
this.light = light;
this.projector = projector;
}
public void watchMovie(String movie) {
System.out.println("Preparing to watch " + movie + "...");
light.dim(10);
projector.turnOn();
projector.setInput("HDMI");
audio.turnOn();
audio.setVolume(5);
System.out.println("Enjoy the movie!");
}
public void endMovie() {
System.out.println("Shutting down...");
audio.turnOff();
projector.turnOff();
light.turnOff();
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
Audio audio = new Audio();
Light light = new Light();
Projector projector = new Projector();
HomeTheaterFacade homeTheater = new HomeTheaterFacade(audio, light, projector);
homeTheater.watchMovie("Inception");
System.out.println("-----");
homeTheater.endMovie();
}
}