c++设计模式概述之外观

类写的不够规范,目的是缩短篇幅,请实际中不要这样做。

 

1、概述

  了解外观模式相关概念后,一下子想到的是主板, 主板上有各种元器件,各种指示灯,各种电容,各种电路。然而,主板供电的接口就一个,其他元器件需要用电的都是从这里获取电源。比如,风扇,LED灯。要是我们单独出来,把每一个元器件单独通电,那主板上得有多少个接口啊, 主板直接通电接口就一个,省却很多麻烦。 

  现实中, 可能会遇到类似上面的情况,需要 一个接口调用 多个子系统的接口。

  下面开始范例, 以主板为例,电扇和LED灯组为子系统, 主板上存在一个假想的开关,控制子系统的电源通断(on off 函数)。

 

2、元器件类,

  元器件可以通断电

// 电器 具有通电和断电的功能
class equipment
{
public:
    virtual void on() = 0;
    virtual void off() = 0;
};

3、LED灯类

// 电灯
class ep_bulb : public equipment
{
public:
    void on()
    {
        cout << "\n电灯打开了\n";
    }

    void off()
    {
        cout << "\n 电灯关闭了 \n";
    }
};

4、风扇

// 风扇
class ep_fan : public equipment
{
public:
    void on()
    {
        cout << "\n风扇打开了\n";
    }

    void off()
    {
        cout << "\n 风扇关闭了 \n";
    }
};

 

5、主板上的一个电源控制开关

// 电源开关集合接口
class power_switch : public equipment
{
public:

    // 电源开关中添加下面两组电器
    power_switch()
    {
        equipment *pinstance = nullptr;

        // 添加电灯
        pinstance = new ep_bulb;
        if (!pinstance)
            cout << "电灯创建失败";
        else
            _plist_ep.push_back(pinstance);

        pinstance = nullptr;
        pinstance = new ep_fan;

        if (!pinstance)
            cout << "电扇创建失败";
        else
            _plist_ep.push_back(pinstance);
    }

    virtual ~power_switch()
    {
        for each(auto index in _plist_ep)
        {
            if (index)
            {
                delete index;
                index = nullptr;
            }
        }
    }

    // -------------------------------------------------------------------------------
    // 对外提供的统一接口
    // -------------------------------------------------------------------------------
    
    // 通电
    void on()
    {
        for each(auto index in _plist_ep)
            index->on();
    }

    // 断电
    void off()
    {
        for each(auto index in _plist_ep)
            index->off();
    }

private:
    list<equipment* > _plist_ep;
};

 

6、调用示例

void call_facade()
{
    std::unique_ptr<equipment> ppower_switch(new(std::nothrow) power_switch);
    if (!ppower_switch)
    {
        cout << "\n 电源开关创建失败 \n";
        return;
    }

    //
    cout << "主板通电结果:";
    ppower_switch->on();

    cout << "\n\n\n\n主板断电结果:";
    ppower_switch->off();
}

 

7、输出结果:

 

posted @ 2020-08-12 18:13  mohist  阅读(129)  评论(0编辑  收藏  举报