학습일지/Language
[Design Pattern] Facade
inspirit941
2020. 12. 28. 08:17
반응형
Facade
Facade 패턴은 '하위 시스템을 보다 쉽게 사용할 수 있게 해주는 인터페이스를 정의하는 것'
Adapter 패턴과 거의 같은 방식으로 작동하지만, 목적이 다르다.
- Adapter : 원래 코드를 다른 코드와 작동할 수 있도록 하는 Wrapper를 제공
- Facade : 원래 코드를 더 쉽게 처리할 수 있는 Wrapper를 제공
객체나 클래스, 인터페이스가 복잡할 경우, 쉽게 사용할 수 있도록 프론트 인터페이스를 제공하는 형태.
- 캡슐화되지 않은 코드를 처리할 때 / 원하는 코드를 다시 작성할 수 없을 때 주로 사용한다.
- 단, 원래의 클래스, 인터페이스 코드가 변경될 경우 Facade 패턴도 변경해야 한다.
패턴의 특징
- 여러 복잡한 클래스를 하나로 간주해서 편하게 다루는 방법
- 따라서, 최소 단위로 클래스를 설계하는 게 가능해진다.
클래스를 세분화하지 않고 사용했을 경우, 비슷한 기능이 필요한 새 객체를 생성할 때 불편할 수 있음
- ex) Computer, Light, Radio라는 클래스를 생성하지 않고 Home이라는 클래스에 해당 기능을 구현 -> Computer가 필요한 또다른 공간 객체(Office 같은)가 필요하면? Computer에 해당하는 기능을 Home
public class ComplexProduct {
char nameChars[] = new char[10];
public ComplexProduct() {}
// 0부터 9까지 이런 형태의 코드가 있음.
public void setFirstNameCharacter(char c) { nameChar[0] = c; }
// ... 데이터를 넣기 매우 불편한 코드구조를 임의로 구현.
}
public class SimpleProductFacade {
ComplexProduct difficultProduct;
public SimpleProductFacade() { this.difficultProduct = new ComplexProduct(); }
public void setName(String n) {
char chars[] = n.toCharArray();
if (char.length > 0) difficultProduct.setFirstNameCharacter(chars[0]);
// ... 이런 형태로 구현.
}
public String getName() { return difficultProduct.getName(); }
}
public class TestFacadePattern {
public static void main(String[] args) {
SimpleProductFacade simpleProductFacade = new SimpleProductFacade();
simpleProductFacade.setName("printer");
System.out.println("this product is a " + simpleProductFacade.getName());
}
}
public class Light {
private boolean turnedOn = false;
public void turnOn() {
this.turnOn = true;
Systeom.out.println("Light on");
}
public void turnOff() {
this.turnOn = false;
Systeom.out.println("Light off");
}
public boolean isTurnedOn() { return turnedOn; }
}
// 이외에도 Computer / Radio 등의 객체도 있다고 할 때
public class HomeFacade {
private Light light;
public HomeFacade(Light light) {
this.light = light;
}
public void homeIn() {
if (!light.isTurnedOn()) light.turnOn();
}
public void homeOut() {
if (light.isTurnedOn()) light.turnOff();
}
}
public class TestFacadePattern {
public static void main(String[] args) {
Light light = new Light();
// facade 없이, 집에서 나간다고 할 때
light.turnOff();
// 다른 객체들도 각자 전부 turnOff() 메소드를 호출해야 함
// facade패턴 적용 시
HomeFacade home = new HomeFacade(light);
home.homeIn();
}
}
반응형