본문

Facade Pattern

반응형

 

Facade Pattern이란, 여러가지 복잡한 것들을 하나로 간주해서 편하게 다루는 방법입니다. 예를 들어, 우리가 흔히 자동차라고 하는 물건은 바퀴, 엔진, 오디오, 사이드 미러 등등 으로 이루어져있지만 우리는 그냥 다 자동차라고 생각하는 게 편합니다. 차안에서 음악을 듣고 싶으면, 그냥 오디오를 켜면 됩니다. "차량에 내장된 오디오"라는 것을 굳이 명확히 하기는 귀찮죠. 

 

 

💡 TV.java

public class TV {
    private boolean turnedOn = false;

    public void turnOn() {
        turnedOn = true;
        System.out.println("TV를 켬");
    }

    public void turnOff() {
        turnedOn = false;
        System.out.println("TV를 끔");
    }

    public boolean isTurnedOn() {
        return turnedOn;
    }
}

 

💡 Audio.java

public class Audio {
    private boolean playing = false;

    public void play() {
        playing = true;
        System.out.println("음악을 연주");
    }

    public void stop() {
        playing = false;
        System.out.println("음악을 멈춤");
    }

    public boolean isPlaying() {
        return playing;
    }
}

 

💡 Light.java

public class Light {
    private int lightness = 0;

    public int getLightness() {
        return lightness;
    }

    public void setLightness(int lightness) {
        System.out.println("밝기를" + lightness + "로 변경");
        this.lightness = lightness;
    }
}

  

💡 Home.java

public class Home {
    private TV tv;
    private Audio audio;
    private Light light;

    public Home(TV tv, Audio audio, Light light) {
        this.tv = tv;
        this.audio = audio;
        this.light = light;
    }

    public void enjoyTv() {
        System.out.println("== 불을 밝게하고 TV보기 ==");
        light.setLightness(2);
        tv.turnOn();
    }

    public void enjoyMusic() {
        System.out.println("");
        System.out.println("== 불을 약간 어둡게하고 음악듣기 ==");
        audio.play();
    }

    public void goOut() {
        System.out.println("");
        System.out.println("== TV끄고, 음악도 끄고, 불도 끄고 외출하기");
        if (tv.isTurnedOn()) {
            tv.turnOff();
        }
        if (audio.isPlaying()) {
            audio.stop();
        }
        light.setLightness(0);
    }
}

 

💡 Main.java

public class Main {
    public static void main(String[] args) {
        TV tv = new TV();
        Audio audio = ne

    
        Home home = new Home(tv, audio, light);
 
        home.enjoyTv();
     

        home.goOut();
    }
}

 

💡 결과

== 불을 밝게하고 TV보기 ==
밝기를2로 변경
TV를 켬
 
== 불을 약간 어둡게하고 음악듣기 ==
음악을 연주
 
== TV끄고, 음악도 끄고, 불도 끄고 외출하기
TV를 끔
음악을 멈춤
밝기를0로 변경

 

예제에서 굳이 TV, Light, Audio라는 클래스들을 만들지 않고, Home 클래스 안에다가 기능을 다 넣을 수도 있었습니다. 그런데, TV가 꼭 Home에 종속되어야 할까요? 요즘은 핸드폰으로도 TV보는 세상인데요. Facade 패턴을 사용하면 최소단위로 클래스를 설계할 수 있습니다. 물론, 지나치게 잘게 쪼개는 것도 그다지 바람직하진 않습니다 . 코드를 다른 데에 복사해서 사용하지 않는 선 정도에서 클래스를 분리시키면 될 것 같습니다. 예제코드의 경우 TV를 분리시키지 않는다면 핸드폰 클래스가 나왔을 때, 핸드폰 클래스의 TV기능을 다시 구현해야하는 사태가 발생합니다.

 

반응형

공유

댓글