Don't give up!

[Design Pattern] 어댑터 패턴(Adapter Pattern)과 퍼사드 패턴(Facade Pattern) 본문

개발서적/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)

 

Head First Design Patterns

볼 거리가 많고 재미있으면서도, 머리 속에 쏙쏙 들어오는 방식으로 구성된 Head First 시리즈. 패턴의 근간이 되는 객체지향 디자인 원칙, 중요한 패턴, 디자인 적용 방법, 쓰지 말아야 하는 이유

www.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();
    }
}