2008-10-30 4 views
15

wikipedia article으로 확인했는데 코드 예제의 C++ 버전이 누락 된 것처럼 보입니다. 나는 이것이 없으면 Facade 패턴을 완전히 고맙게 생각할 수 없다. C++을 사용하여 나를 설명하는 것을 도울 수 있겠는가?C + + 예제를 사용하여 Facade 패턴을 설명 하시겠습니까?

+0

이 기사에 대한 링크를 제공해 주시겠습니까? –

+0

http://en.wikipedia.org/wiki/Facade_pattern – yesraaj

+0

질문 편집은 다른 사람들에게 도움이 될 것입니다. – tonylo

답변

21

외관 패턴 : 복잡한 하위 시스템 또는 인터페이스 세트에 통일되고 단순화 된 인터페이스를 제공합니다. 복잡한 서브 시스템과 클라이언트를 동시에 분리하는 고급 인터페이스를 제공합니다.

택시 운전사를 이해하는 데 도움이되는 예제입니다. 택시 운전사에게 'Take me to PointX'(통일 된 단순화 된 고급 인터페이스)를 말하면 누가 일련의 동작 (키를 돌리고, 기어를 바꾸고, 가속기 등을 눌러 ...)을 시작하여 작업을 수행합니다. 그는 서브 시스템 (기어 박스, 엔진 등)의 복잡성을 추상화하여 사용자가 걱정하지 않아도됩니다. 운전자는 사용 된 실제 차량에서 당신을 분리합니다 ... 자동차와 직접 인터페이스하지 않습니다. 당신은 잠재적으로 그에게 Merc를 줄 수 있었다. 그러나 운전자와 당신의 인터페이스는 여전히 TakeMeTo (X) 일 것이다. 당신은 어떤 특정 모델/차종에 묶여 있지 않다.

실세계 예에서 타사 구성 요소 또는 라이브러리와 상호 작용하는 외관을 찾을 수 있습니다. 코드가 특정 공급 업체에 의존하는 것을 원하지 않으므로 분리 할 facade 인터페이스를 도입하십시오. 또한이 인터페이스를 단순화 할 것입니다. Facade 인터페이스는 SendData (string)라는 메소드를 가지지 만, 내부적으로 구현은 특정 순서로 m 개의 서브 패키지에 대해 n 개의 메소드를 호출하여 태스크를 완료 할 수 있습니다. 이것은 위키피디아 페이지의 다이어그램이 보여주는 것입니다.

C에 an example 번역 ++와 C++에서 WWW 것은 작은 여기

sResource = LWCPPSimple::get("http://www.perl.org") 

가상 라이브러리를 유지하는 것은 내가 리소스를 가져 오는 나의 주된 관심사에 집중할 수 있도록 문제의 프로토콜, 네트워크 및 구문 분석 측면을 통합 외관입니다 . get 메소드는 HTTP, FTP 및 기타 다양한 프로토콜, 요청 - 응답, 연결 관리 등의 복잡성 (경우에 따라 추함)을 숨기거나 캡슐화하거나 유지합니다. 또한 내일이면 LWCPPSimple의 작성자가 get()을 두 배 빠르게 만드는 방법은 무료로 성능상의 이점을 얻습니다. 내 클라이언트 코드는 변경할 필요가 없습니다.

+0

와우. 나는이 설명을 좋아한다. 내 말은, Facade가 무엇인지는 알았지 만 이것은 대단한 것입니다. –

+0

기쁜 당신은 그것을 좋아했다 :) – Gishu

+0

큰 설명,이 코드 예제 답변으로 잘 갈 수 있습니다. http://stackoverflow.com/questions/249581/explain-facade-pattern-with-c-example#249995 –

3

나는 C# 예제에서 검색과 바꾸기를했다. 당신은 C를 이해한다면이 같은 구조 및 키워드 (클래스, 함수, 네임 스페이스, 공공 등) 어떤 의미에서

// "Subsystem ClassA" 
#include <iostream> 
class SubSystemOne 
{ 
public: 
    void MethodOne() 
    { 
     std::cout << " SubSystemOne Method" << std::endl; 
    } 
} 

// Subsystem ClassB" 

class SubSystemTwo 
{ 
public: 
    void MethodTwo() 
    { 
     std::cout << " SubSystemTwo Method" << std::endl; 
    } 
} 

// Subsystem ClassC" 

class SubSystemThree 
{ 
public: 
    void MethodThree() 
    { 
      std::cout << " SubSystemThree Method" << std::endl; 
    } 
} 

// Subsystem ClassD" 

class SubSystemFour 
{ 
public: 
    void MethodFour() 
    { 
     std::cout << " SubSystemFour Method" << std::endl; 
    } 
} 

// "Facade" 

class Facade 
{ 
    SubSystemOne one; 
    SubSystemTwo two; 
    SubSystemThree three; 
    SubSystemFour four; 

public: 
    Facade() 
    { 
    } 

    void MethodA() 
    { 
     std::cout << "\nMethodA() ---- " << std::endl; 
     one.MethodOne(); 
     two.MethodTwo(); 
     four.MethodFour(); 
    } 
    void MethodB() 
    { 
     std::cout << "\nMethodB() ---- " << std::endl; 
     two.MethodTwo(); 
     three.MethodThree(); 
    } 
} 

int Main() 
{ 
    Facade facade = new Facade(); 

    facade.MethodA(); 
    facade.MethodB(); 

    return 0; 
} 
2

을 사용하기 때문에 ++ 다음은 C#을 이해할 수 있어야하기 때문에, 도움이되지 않을 수도 있습니다 Facade는 숨겨진 기능과 상호 작용하려는 클라이언트를위한 API 일뿐입니다.

Facade는 C++로 구현되거나 API보다 복잡한 간단한 C API를 노출 할 때 유용합니다. 또는 라이브러리가 반복적 인 업데이트를 거쳐야하고 클라이언트에 가능한 한 영향을 미치기를 원할 때 클라이언트와 라이브러리간에 고정 된 장벽을 확보 할 수 있습니다. 예를 들어, C 기반 라이브러리를 내부적으로 C++ 또는 다른 것으로 업데이트해야하거나 전혀 다른 것으로 교체 한 경우 Facade는 클라이언트의 중간 계층입니다.

12
class Engine 
{ 

public: 
    void Start() { } 

}; 

class Headlights 
{ 

public: 
    void TurnOn() { } 

}; 

// That's your facade. 
class Car 
{ 

private: 
    Engine engine; 
    Headlights headlights; 

public: 
    void TurnIgnitionKeyOn() 
    { 
     headlights.TurnOn(); 
     engine.Start(); 
    } 

}; 

int Main(int argc, char *argv[]) 
{ 
    // Consuming facade. 
    Car car; 
    car.TurnIgnitionKeyOn(); 

    return 0; 
} 
0
class A { 
    private B b; // Class A uses Class B, the "interface" 
    public int f() { return b.g(); } 
}; 

class B { 
    private C c; // class B uses class C, a "subsystem" 
    private ... ...; // other subsystems can be added 
    public int g() { c.h(); return c.i(); } 
}; 

class C { // a subsystem 
    public void h() { ... } 
    public int i() { return x; } 
}; 

클래스 A는 직접 방법을 사용하거나 직접 클래스 C 또는 클래스 B에 포함 된 다른 서브 시스템의 상태에 영향을 미치지 않습니다. 하위 시스템의 수와 상관 없으므로 여기에 하나의 하위 시스템 만 표시됩니다.

관련 문제