문제

나는 그것을 확인했다 위키 백과 기사, 코드 예제의 C ++ 버전이 누락 된 것 같습니다. 이것없이 외관 패턴을 완전히 이해할 수 없습니다. C ++를 사용하여 설명하는 데 도움을 주시겠습니까?

도움이 되었습니까?

해결책

정면 패턴 : 복잡한 서브 시스템 또는 인터페이스 세트에 대한 단순화 된 인터페이스를 제공합니다. 복잡한 서브 시스템에서 클라이언트를 동시에 분리하는 더 높은 레벨 인터페이스를 제공합니다.

당신이 이해하는 데 도움이되는 예 .. 택시 운전사. 당신은 택시 드라이버가 'Pointx로 나를 데려 간다'(Unified Simplified High Level Interface)를 말한 다음 일련의 동작 (키를 돌리고 기어를 변경하고 가속기를 누르는 등)을 시작하여 작업을 수행합니다. 그는 기본 서브 시스템 (기어 박스, 엔진 등)의 복잡성을 추상화하여 걱정할 필요가 없습니다. 운전자는 또한 사용 된 실제 차량에서 당신을 분리합니다 ... 당신은 자동차와 직접 인터페이스하지 않습니다. 당신은 잠재적으로 그에게 머지를 줄 수 있지만 운전자에 대한 당신의 인터페이스는 여전히 takemeto (x)입니다. 당신은 자동차의 특정 모델/제조업에 묶여 있지 않습니다.

실제 예에서는 타사 구성 요소 또는 라이브러리와 인터페이스하는 정면을 찾을 수 있습니다. 코드가 특정 공급 업체에 의존하는 것을 원하지 않으므로 해체에 대한 외관 인터페이스를 소개합니다. 또한이 인터페이스를 단순화 할 것입니다. 예를 들어 Facade 인터페이스에는 senddata (string)라는 메소드가 있지만 내부적으로 구현은 M 서브 포장에서 N 메소드를 특정 순서로 호출하여 작업을 완료 할 수 있습니다. 이것이 Wikipedia 페이지의 다이어그램이 보여주는 것입니다.

예를 들어 번역 C ++에 작게 유지합니다

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

여기서 C ++의 www 용 가상 라이브러리는 문제의 프로토콜, 네트워크 및 구문 분석 측면을 통합하여 자원을 가져 오는 주요 초점에 집중할 수있는 외관입니다. GET 메소드는 HTTP, FTP 및 기타 다양한 프로토콜, 요청-응답, 연결 관리 등의 복잡성 (및 경우에 따라 추악함)을 숨기기/캡슐화/보관합니다. get ()를 두 배나 빠르게 만드는 방법은 무료로 성능 혜택을 얻습니다. 내 클라이언트 코드를 변경할 필요가 없습니다.

다른 팁

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;
}

검색을 수행하고 C# 예제를 교체했습니다. 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;
}

어떤 의미에서, 외관은 숨겨진 것과 상호 작용하려는 고객에게 API 일뿐입니다.

이 외관은 C ++에서 구현되거나 API보다 단순히 더 복잡한 것에 대해 간단한 C API를 노출시킬 때 유용합니다. 또는 라이브러리가 수많은 반복 업데이트를 거쳐야 할 때 클라이언트와 라이브러리 사이에 고정 장벽을 얻으려면 가능한 한 적은 고객에게 영향을 미치기를 원합니다. 예를 들어, C 기반 라이브러리를 내부적으로 C ++ 또는 다른 것으로 업데이트하거나 완전히 다른 것으로 바꾸어야하는 경우, 외관은 클라이언트에게 좋은 중간 계층입니다.

거기 있습니다 C ++ 예제 ~을 위한 정면 디자인 패턴에 대한이 훌륭한 사이트에서.

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에 포함 된 기타 서브 시스템에 직접 영향을 미치지 않습니다. 서브 시스템이 몇 개나 중요하지 않기 때문에 여기에는 하나의 서브 시스템 만 표시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top