用c ++示例解释Facade模式?

时间:2008-10-30 08:33:55

标签: c++ design-patterns facade

我已经使用wikipedia article进行了检查,似乎缺少代码示例的c ++版本。如果没有这个,我无法完全理解Facade模式,请你用C ++帮我解释一下?

6 个答案:

答案 0 :(得分:23)

Facade模式:为复杂的子系统或一组接口提供统一的简化接口。它提供了更高级别的接口,同时将客户端与复杂的子系统分离。

帮助您了解驾驶室司机的示例。你告诉出租车司机'带我去PointX'(统一的简化高级界面)然后开始一系列动作(转动钥匙,换档,按下加速器等......)来执行任务。他抽象出底层子系统(变速箱,引擎等)的复杂性,因此您不必担心它们。 驾驶员还将您与实际使用的车辆分离...您不直接与汽车接口。你可能会给他一个Merc,但是你对Driver的界面仍然是TakeMeTo(X)..你没有被限制在汽车的任何特定型号/品牌上。

在现实世界的示例中,您将找到与第三方组件或库接口的外观。您不希望代码依赖于特定供应商,因此您需要引入外观接口来进行分离。您还可以简化此界面,例如您的facade接口将有一个名为SendData(string)的方法,但在内部,实现可以按特定顺序在m个子包上调用n个方法来完成任务。这就是维基百科页面上的图表所示。

e.g。将an example翻译成C ++并保持微小

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

这里虚构的C ++ WWW库是一个外观,它统一了协议,网络和解析问题的各个方面,以便我可以专注于获取资源的主要重点。 get方法隐藏/封装/保持一致的HTTP,FTP和其他各种协议的复杂性(在某些情况下是丑陋的),请求 - 响应,连接管理等。如果明天LWCPPSimple的创建者找到一个让get()快两倍的方法,我免费获得性能优势。我的客户端代码不必更改。

答案 1 :(得分:15)

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

答案 2 :(得分:4)

我已经在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;
}

答案 3 :(得分:3)

从某种意义上说,Facade只是希望与隐藏的东西进行交互的客户的API。

在为C ++实现的或仅比API更复杂的内容公开简单的C API时,Facade非常有用。或者,当库需要经历多次迭代更新并且您希望尽可能少地影响客户端时,在客户端和库之间获得固定的屏障。例如,如果基于C的库需要在内部更新为C ++或其他东西,或者只是交换完全不同的东西,那么Facade是客户端的良好中间层。

答案 4 :(得分:2)

在这个优秀的设计模式网站C++ examples Facade

答案 5 :(得分: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类包含的任何其他子系统的状态。这里只显示了一个子系统,因为它有多少子系统并不重要。