디자인패턴7 Facade
Facade
하위 시스템을 보다 쉽게 사용할 수 있게 해주는 고급 인터페이스를 정의한다.
파사드 패턴은 어댑터 패턴과 거의 같은 방식으로 작동하지만 서로 다른 목적을 가지고 있다.
Adapter | Facade |
---|---|
원래 코드를 다른 코드와 작동할 수 있게 하는 래퍼를 제공 | 원래 코드를 더 쉽게 처리 할 수 있는 래퍼를 제공 |
파사드 디자인 패턴은 오브젝트나 클래스 인터페이스가 작동하기에 너무 어려울 경우, 쉽게 사용할 수 있는 프론트엔드 인터페이스를 제공한다.
- 캡슐화되지 않은 코드를 처리할 때 사용
- 원하는 코드르 다시 작성할 수 없을때 일반적으로 사용
- (단점)파사드를 사용하면 문제를 해결할 수 있지만 기본 코드가 변경되면 파사드 패턴도 변경해야 한다.
예제
package case1;
public class ComplexProduct {
char nameChars[] = new char[10];
public ComplexProduct() {
}
public void setFirstNameCharacter(char c) {
nameChars[0] = c;
}
public void setSecondNameCharacter(char c) {
nameChars[1] = c;
}
public void setThirdNameCharacter(char c) {
nameChars[2] = c;
}
public void setFourthNameCharacter(char c) {
nameChars[3] = c;
}
public void setFifthNameCharacter(char c) {
nameChars[4] = c;
}
public void setSixthNameCharacter(char c) {
nameChars[5] = c;
}
public String getName() {
return new String(nameChars);
}
}
package case1;
public class SimpleProductFacade {
ComplexProduct difficultProduct;
public SimpleProductFacade() {
difficultProduct = new ComplexProduct();
}
public void setName(String n) {
char chars[] = n.toCharArray();
if (chars.length > 0) {
difficultProduct.setFirstNameCharacter(chars[0]);
}
if (chars.length > 1) {
difficultProduct.setSecondNameCharacter(chars[1]);
}
if (chars.length > 2) {
difficultProduct.setThirdNameCharacter(chars[2]);
}
if (chars.length > 3) {
difficultProduct.setFourthNameCharacter(chars[3]);
}
if (chars.length > 4) {
difficultProduct.setFifthNameCharacter(chars[4]);
}
if (chars.length > 5) {
difficultProduct.setSixthNameCharacter(chars[5]);
}
}
public String getName() {
return difficultProduct.getName();
}
}
package case1;
public class TestPattern {
public static void main(String[] args) {
SimpleProductFacade simpleProductFacade = new SimpleProductFacade();
simpleProductFacade.setName("printer");
System.out.println("the product is a...." + simpleProductFacade.getName());
}
}
//실행결과
//the product is a....printe
예시2
파사드 패턴은 여러가지 복잡한 것들을 하나로 간주해서 편하게 다루는 방법이다. 그렇기에 파사드 패턴을 사용하면 최소 단위로 클래스를 설계할 수 있게 된다.
(지나치게 잘게 쪼개는 것도 그다지 바람직한 것은 아님.)
ex) Home클래스 내 Computer, Light, Radio 클래스가 종속되어있을경우 Office클래스가 나왔을 때, Computer클래스의 기능을 다시 구현해야 하는 사태가 발생한다. 최소 단위로 쪼개어 구현했다면 그러지 않아도 될 것이다.
package case2;
public class Computer {
private boolean turnedOn = false;
public void turnOn() {
turnedOn = true;
System.out.println("Computer ---ON");
}
public void turnOff() {
turnedOn = false;
System.out.println("Computer ---OFF");
}
public boolean isTurnedOn() {
return turnedOn;
}
}
package case2;
public class Light {
private boolean turnedOn = false;
public void turnOn() {
turnedOn = true;
System.out.println("Light ---ON");
}
public void turnOff() {
turnedOn = false;
System.out.println("Light ---OFF");
}
public boolean isTurnedOn() {
return turnedOn;
}
}
package case2;
public class Radio {
private boolean turnedOn = false;
public void turnOn() {
turnedOn = true;
System.out.println("Radio ---ON");
}
public void turnOff() {
turnedOn = false;
System.out.println("Radio ---OFF");
}
public boolean isTurnedOn() {
return turnedOn;
}
}
package case2;
public class HomeFacade {
private Computer computer;
private Light light;
private Radio radio;
public HomeFacade(Computer computer, Light light, Radio radio) {
this.computer = computer;
this.light = light;
this.radio = radio;
}
public void homeIn() {
System.out.println("집에오면 computer / radio / light ON");
if(!computer.isTurnedOn()) {
computer.turnOn();
}
if(!light.isTurnedOn()) {
light.turnOn();
}
if(!radio.isTurnedOn()) {
radio.turnOn();
}
}
public void homeOut() {
System.out.println("외출할떈 computer / radio / light OFF");
if(computer.isTurnedOn()) {
computer.turnOff();
}
if(light.isTurnedOn()) {
light.turnOff();
}
if(radio.isTurnedOn()) {
radio.turnOff();
}
}
}
package case2;
public class TestPattern {
public static void main(String[] args) {
Computer c = new Computer();
Light l = new Light();
Radio r = new Radio();
//이전 사용 방식
c.turnOff();
l.turnOff();
r.turnOff();
//파사드 패턴 적용 후 방식
HomeFacade home = new HomeFacade(c, l, r);
home.homeIn();
}
}