<디자인패턴입문> 12. Facade 패턴
by BFinewww.yes24.com/Product/Goods/2918928
가. 무엇인가
a. 창구는 열려있습니다
- 프로그램은 점점 커진다. 그러면서 많은 클래스간 서로 관계를 맺으면서 복잡하게 된다.
=> 어떤 기능을 처리하기 위해 상호 관련된 많은 클래스를 적절하게 제어가 필요하다!
- 처리를 실행하기 위한 창구를 준비해 두는 것이 좋다!
=> 창구를 두면 개별적으로 제어하지 않아도 해당 창구에 대해서만 요구하면 역할이 끝나기 때문!
- facade(퍼사드) 패턴은 건물의 정면이라는 의미를 가지고 있고 외부에 대해서는 단순한 인터페이스만을 보여준다.
나. 만들어본 예제
a. Facade (정면) 역할
- 시스템을 구성하고 있는 많은 역할에 대해 단순한 창구가 된다.
- 최상위 레벨에서 단순한 인터페이스를 제공한다. 예제에서는 process 이다.
public class Facade {
public static String process(Type type,int ...keyArray){
MapData mapData = new MapData();
PropertiesData propertiesData = new PropertiesData();
switch(type){
case MAP:
return mapData.getData(keyArray);
case PROPERTIES:
return propertiesData.getData(keyArray);
default:
return null;
}
}
}
b. 요소들
- 시스템을 구성하는 다른 요소들(클래스)은 각각의 임무를 실행하지만 Facade에 대해서는 신경쓰지 않는다.
- Facade 역할으로부터 호출 되어지지만 반대로 Facade를 호출하는일은 없다.
public class MapData {
Map<Integer,String> store = new WeakHashMap<>();
{
store.put(1,"YOU");
store.put(2,"WILL");
store.put(3,"B");
store.put(4,"FINE");
store.put(5,"BLOG");
}
public String getData(int ...keyArray){
StringBuilder sb = new StringBuilder();
for(int key:keyArray){
sb.append(store.get(key)).append(" ");
}
return sb.toString();
}
}
public class PropertiesData {
public String getData(int ...keyArray){
Properties properties = new Properties();
StringBuilder sb = new StringBuilder();
try {
properties.load(new FileReader("resources/store.properties"));
for (int key:keyArray) {
sb.append(properties.getProperty(String.valueOf(key))).append(" ");
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
/** store.properties
1=you
2=will
3=b
4=fine
5=blog
*/
e. Main (Client) 역할
- Facade 패턴을 쓰지 않는 경우를 보면 모든 요소에 대한 의존성을 가져야한다.
=> 예제로는 두개밖에 안만들었지만 엄청 복잡할경우 거대해질것이라는 것을 예상할 수 있다.
public class Main {
public static void main(String[] args) {
// normal
MapData mapData = new MapData();
PropertiesData propertiesData = new PropertiesData();
System.out.println(mapData.getData(1,2,3,4,5));
System.out.println(propertiesData.getData(1,2,3,4,5));
// facade
System.out.println(Facade.process(Type.MAP,1,2,3,4,5));
System.out.println(Facade.process(Type.PROPERTIES,1,2,3,4,5));
}
}
다. 정리
a. Facade 역할은 무엇?
- 퍼사드 패턴은 복잡한 것을 단순하게 보여준다. 복잡한 것은 내부의 많은 클래스 관계나 사용법을 의미한다.
=> 이 복잡한 것을 의식하지 않도록 해준다.
- 핵심은 인터페이스를 적게 하는 일!!
=> 적다는 것은 외부와의 결합이 소원
b. 재귀적인 Facade 패턴의 적용
- Facade 역할을 가진 클래스의 집합이 여러개가 있을경우 이 집합을 정리해서 새로운 Facade역할을 도입도 가능
- 큰시스템이 다수의 클래스, 패키지를 포함하고 있을때 요소요소에 Facade 패턴을 적용하면 보다 편리해진다.
Facade 패턴은 연관된 클래스들을 모아서 최소한의 인터페이스를 제공하는 창구 패턴이다.
'개발서적 > 디자인패턴입문' 카테고리의 다른 글
<디자인패턴입문> 14. Observer 패턴 (0) | 2021.05.07 |
---|---|
<디자인패턴입문> 13. Mediator 패턴 (0) | 2021.05.06 |
<디자인패턴입문> 11. Chain of Responsibility 패턴 (0) | 2021.05.04 |
<디자인패턴입문> 10. Visitor 패턴 (0) | 2021.05.03 |
<디자인패턴입문> 9. Decorator 패턴 (0) | 2021.05.02 |
블로그의 정보
57개월 BackEnd
BFine