본문 바로가기

코드 디자인 패턴/java

[java & 디자인 패턴] Facade 패턴 정리

개념


객체 지향 프로그래밍의 관점에서 객체들은 재사용을 위해 최소 단위로 분리된다. 클라이언트의 관점에서 이들 중 일부 클래스는 인터페이스 작동이 복잡하여 코드 작성 과정에서 강한 결합 문제가 발생하거나 함께 사용해야 하는 클래스를 일일히 신경쓰게 만든다.

 

파사드 패턴은 이런 문제,  클라이언트에서 최소 단위 클래스 사용의 추상화를 위해 사용한다.

그 방식은 최소 단위 클래스의 사용조합을 일종의 클래스 메서드로 정의한다.

 

 

구현


서브시스템 클래스

파사드 패턴에서 실제로 작동하는 최소 단위 로직의 클래스다.

public class Computer {

	private boolean turnOn;

	public void turnOn() {
		this.turnOn = true;
		System.out.println("컴퓨터 키기");
	}

	public void turnOff() {
		this.turnOn = false;
		System.out.println("컴퓨터 끄기");
	}

	public boolean isTurnOn() {
		return this.turnOn;
	}

}

public class Light {

	private boolean turnOn;

	public void turnOn() {
		this.turnOn = true;
		System.out.println("라이트 키기");
	}

	public void turnOff() {
		this.turnOn = false;
		System.out.println("라이트 끄기");
	}

	public boolean isTurnOn() {
		return this.turnOn;
	}

}

public class Radio {

	private boolean turnOn;

	public void turnOn() {
		this.turnOn = true;
		System.out.println("라디오 키기");
	}

	public void turnOff() {
		this.turnOn = false;
		System.out.println("라디오 끄기");
	}

	public boolean isTurnOn() {
		return this.turnOn;
	}

}

 

파사드

서브시스템 클래스를 조합하여 추상화된 인터페이스를 제공한다.

public class FasadHome {
	private Computer computer;
	private Light light;
	private Radio radio;

	public FasadHome(Computer computer, Light light, Radio radio) {
		super();
		this.computer = computer;
		this.light = light;
		this.radio = radio;
	}

	
	public void homeIn() {
		System.out.println("집 안에 가전기구를 키는 작업 시작");
		if (!computer.isTurnOn()) {
			computer.turnOn();
		}
		if(!light.isTurnOn()) {
			light.turnOn();
		}
		if(!radio.isTurnOn()) {
			radio.turnOn();
		}
	}
	
	public void homeOut() {
		System.out.println("집 안에 가전기구를 끄는 작업 시작");
		if(computer.isTurnOn()) {
			computer.turnOff();
		}
		if(light.isTurnOn()) {
			light.turnOff();
		}
		if(radio.isTurnOn()) {
			radio.turnOff();
		}
	}
	
	
}

 

클라이언트 코드

파사드 인스턴스를 생성하고 서브시스템 클래스를 세팅해줌으로써 간단하게 서브시스템 로직의 조합을 사용할 수 있다.

public class FasadHome {
	private Computer computer;
	private Light light;
	private Radio radio;

	public FasadHome(Computer computer, Light light, Radio radio) {
		super();
		this.computer = computer;
		this.light = light;
		this.radio = radio;
	}

	
	public void homeIn() {
		System.out.println("집 안에 가전기구를 키는 작업 시작");
		if (!computer.isTurnOn()) {
			computer.turnOn();
		}
		if(!light.isTurnOn()) {
			light.turnOn();
		}
		if(!radio.isTurnOn()) {
			radio.turnOn();
		}
	}
	
	public void homeOut() {
		System.out.println("집 안에 가전기구를 끄는 작업 시작");
		if(computer.isTurnOn()) {
			computer.turnOff();
		}
		if(light.isTurnOn()) {
			light.turnOff();
		}
		if(radio.isTurnOn()) {
			radio.turnOff();
		}
	}
	
	
}