2011년 5월 23일 월요일

The Facade Pattern

10. The Facade Pattern
프로그램이라는 것은 점점 커지는 경향이 있습니다. 많은 클래스가 만들어져 상호 연관을 맺으면서 복잡해집니다. 클래스를 사용하는 경우에는 클래스간의 관계를 올바로 이해하고 정확한 순서대로 메소드를 호출해야 합니다. 대규모 프로그램을 사용해서 처리를 하려면 서로 관련 있는 많은 클래스들을 적절히 제어 해야 합니다. 많은 클래스들을 제어하기 위해서는 ‘창구’를 준비해 두는 것이 좋습니다. 그렇게 하면 많은 클래스들을 개별적으로 제어하지 않아도 ‘창구’에게 요구만 하면 일이 끝나기 때문입니다. 이와 같은 ‘창구’를 ‘Façade’라 합니다.
Façade 패턴은 복잡하게 얽혀있는 것을 정리해서 높은 레벨의 인터페이스(API)를 제공합니다. Façade 역할은 시스템의 외부에는 간단한 인터페이스(API)를 보여주면서, 시스템의 안쪽에 있는 각 클래스의 역할이나 의존관계를 생각해서 올바른 순서로 클래스를 이용하는 역할입니다.
단순히 말하면 Façade 패턴은 복잡한 클래스를 단순한 인터페이스로 포장하기 위해 사용됩니다.
구조
*


역할
v façade의 역할
Façade는 시스템을 구성하고 있는 많은 역할의 ‘간단한 창구’가 되는 역할입니다. Façade는 높은 레벨에서 간단한 인터페이스(API)를 시스템 외부에 제공합니다.
의도
Façade 패턴은 클라이언트를 복잡한 하위 시스템 컴포넌트로부터 보호하고, 일반 사용자들에게 좀더 간단한 프로그래밍 인터페이스를 제공하는데 의도가 있습니다.
적용시기
  • 서브시스템 컴포넌트로부터 클라이언트들을 보호한다. 그러함으로써 클라이언트가 다루는 객체의 수를 줄이고, 서브시스템을 이용하기 쉽게 해준다.
  • 서브시스템과 클라이언트 간의 연결관계를 약하게 해준다. 종종 서브시스템 컴포넌트는 클라이언트와 강한 연결관계를 가지기도 한다. 약한 연결관계는 클라이언트에게 영향을 미치지 않으면서 서브시스템의 컴포넌트들을 다양하게 만들어준다. Facade는 시스템과 객체간의 의존성을 계층화 하는데 도움을 준다. Facade는 복잡함이나 순환의존성을 없애준다.

결론
Façade 패턴은 클라이언트를 복잡한 하위 시스템 컴포넌트로부터 보호하고, 일반 사용자들에게 좀더 간단한 프로그래밍 인터페이스를 제공한다. 그러나 Façade 패턴은 고급 사용자가 필요한 경우 좀더 심도 있고 복잡한 클래스 구조를 분석하는 것을 방지하지 못한다.
게다가 façade 패턴은 클라이언트 프로그램의 소스코드를 변경하지 않고도 개발자가 기본 하위 시스템의 내용을 변경할 수 있게 하며, 편집 과정에서의 의존성을 감쇄시키다.
클라이언트-서브시스템 연결관계를 줄여라.
클라이언트와 서브시스템간의 연결관계는 Facade를 추상클래스로 만듬으로써 줄일 수 있다. 그러면 클라이언트는 추상 Facade class의 인터페이스를 통해 서브시스템과 대화할 수 있다. 이러한 추상클래스와의 연결은 클라이언트가 사용할 서브시스템의 구현을 알아야 하는 필요성을 없애준다. 서브클래싱의 대체는 다른 서브시스템 객체를 가진 Facade 객체로 설정하는 것이다. facade를 커스터마이징하려면 단순히 서브시스템 객체를 다른 객체로 교환한다.


예제소스
*


예제 소스
package pagemaker;
import java.util.*;
public class Database {
private Database() {
}
public static Hashtable getProperties() {
Hashtable property = new Hashtable();
property.put("7su@tomato.com","철수");
property.put("02@tomato.com","영희");
property.put("10000su@tomato.com","만수");
return property;
}
}
package pagemaker;
public class HtmlWriter {
StringBuffer writer;
public HtmlWriter(StringBuffer writer) {
this.writer = writer;
}
public void title(String title) {
writer.append("<html>");
writer.append("<head>");
writer.append("<title>" + title + "</title>");
writer.append("</head>");
writer.append("<body>\n");
writer.append("<h1>" + title + "</h1>\n");
}
public void paragraph(String msg){
writer.append("<p>" + msg + "</p>\n");
}
public void link(String href, String caption) {
paragraph("<a href=\"" + href + "\">" + caption + "</a>");
}
public void mailto(String mailaddr, String username) {
link("mailto:" + mailaddr, username);
}
public void close() {
writer.append("</body>");
writer.append("</html>\n");
}
}
package pagemaker;
import java.util.Hashtable;
public class PageMaker {
private PageMaker() {
}
public static void makeWelcomePage(String mailaddr) {
try {
StringBuffer buffer = new StringBuffer();
Hashtable mailprop = Database.getProperties();
String username = mailprop.get(mailaddr).toString();
HtmlWriter writer = new HtmlWriter(buffer);
writer.title("Welcome to " + username + "'s page!");
writer.paragraph(username + "의 페이지에 오신걸 환영합니다.");
writer.paragraph("메일이 기다리고 있습니다.");
writer.mailto(mailaddr, username);
writer.close();
System.out.println(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
import pagemaker.PageMaker;
public class mainClass {
public static void main(String[] args) {
PageMaker.makeWelcomePage("02@tomato.com");
}
}


관련패턴
  • Abstact Factory : Facade구현시 서브시스템 독립적인 방법으로 서브시스템 객체를 만들 수 있는 인터페이스를 제공하기 위해 사용한다. Abstract Factory는 또한 플랫폼 비독립적 클래스를 감추기 위해 Facade의 대안으로서 사용할 수 있다.
  • Mediator : 존재하는 class들의 기능들을 추상화시킨다는 점에서 Facade와 비슷하다. 하지만 Mediator의 목적은 정해지지 않은 동료클래스간의 통신을 추상화시키고, 해당 동료클래스군 어디에도 포함되지 않는 기능들을 중앙으로 모은다. Mediator의 동료클래스들은 Mediator에 대한 정보를 가지며 서로 직접적으로 통신하는 대신 mediator를 통해 통신한다. 대조적으로 facade는 단지 서브시스템들을 사용하기 편하게 하기 위해서 서브시스템들의 인터페이스를 추상화시킬 뿐이다. facade는 새로운 기능을 새로 정의하지 않으며, 서브시스템 클래스는 facade에 대한 정보를 가질 필요가 없다.
  • Singleton : 보통 facade는 단일 오브젝트로 요구된다. 그래서Facade 객체는 종종 Singleton으로 구현된다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...