개발서적/Head First Design Patterns
[Design Pattern] 어댑터 패턴(Adapter Pattern)과 퍼사드 패턴(Facade Pattern)
Heang Lee
2021. 12. 16. 15:52
이 글은 에릭 프리먼의 'Head First Design Patterns'를 읽고 TIL(Today I Learned)로써 정리한 내용을 기록하는 글입니다.
자세한 내용은 책을 통해 확인하실 수 있습니다.
알라딘: Head First Design Patterns (aladin.co.kr)
어댑터 패턴(Adapter Pattern)
어댑터 패턴은 한 클래스의 인터페이스를 클라이언트가 사용하는 다른 인터페이스로 변환하는 디자인 패턴입니다.
사용하고자 하는 클래스의 내부를 확인/수정할 수 없거나, 해당 클래스를 수정하였을 때 이를 사용하는 다른 코드로부터 문제가 발생할 것으로 우려되는 경우 어댑터 패턴을 사용함으로써 문제를 해결할 수 있습니다.
//Target 인터페이스.
public interface Duck {
public void quack();
public void fly();
}
//Duck를 구현한 MallardDuck 클래스.
public class MallardDuck implements Duck {
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
//Adaptee 인터페이스. Duck와 다른 메소드를 사용함.
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("Gobble gobble");
}
public void fly() {
System.out.println("I'm flying a short distance");
}
}
//Adapater 클래스. turkey 객체를 Duck 객체로 변환.
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapater(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
for(int i=0; i<5; i++) {
turkey.fly();
}
}
}
퍼사드 패턴(Facade Pattern)
퍼사드 패턴은 복잡한 서브 시스템에 대해 통합된 인터페이스를 제공하는 디자인 패턴입니다.
외부 라이브러리와 같은 복잡한 시스템을 간략화하는 클래스를 제공함으로써 Client는 Facade 클래스에 대해서만 알 수 있도록 하여 서브 시스템에 의존하지 않도록 할 수 있습니다.
public class HomeTheaterFacade {
Amplifier amp;
Tuner tuner;
DvdPlayer dvd;
CdPlayer cd;
Projector projector;
TheaterLights lights;
Screen screen;
PopcornPopper popper;
public HomeTheaterFacade(Amplifier amp, Tuner tuner, DvdPlayer dvd,
CdPlayer cd, Projector projector, Screen screen,
TheaterLights lights, PopcornPopper popper) {
this.amp = amp;
this.tuner = tuner;
this.dvd = dvd;
this.cd = cd;
this.projector = projector;
this.screen = screen;
this.lights = lights;
this.popper = popper;
}
public void watchMovie(String movie) {
System.out.println("Get ready to watch a movie...");
popper.on();
popper.pop();
lights.dim(10);
screen.down();
projector.on();
projector.wideScreenMode();
amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
amp.setVolume(5);
dvd.on();
dvd.play(movie);
}
public void endMovie() {
System.out.println("Shutting movie theater down...");
popper.off();
lights.on();
screen.up();
projector.off();
amp.off();
dvd.stop();
dvd.eject();
dvd.off();
}
}
public class HomeTheaterTestDrive {
public static void main(String[] args) {
HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, tuner, dvd, cd, projector, screen, lights, popper);
homeTheater.watchMovie("Radiers of the Lost Ark");
homeTheater.endMovie();
}
}