设计模式学习 — 外观模式

外观模式定义

Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。
Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade

外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

属于结构型设计模式

菜鸟教程的介绍

在这里插入图片描述

简单的案例一

在一个系统中,往往完成一个功能需要多个子系统一同执行才能完成,比如录制视频,捕捉视频图像用到摄像头,捕捉音频要使用到麦。

class SubSystem1
{
    
    
public:
    void run();
};

void SubSystem1::run()
{
    
    
    cout << "子系统1运行" << endl;
}

class SubSystem2
{
    
    
public:
    void run();
};

void SubSystem2::run()
{
    
    
    cout << "子系统2运行" << endl;
}

class SubSystem3
{
    
    
public:
    void run();
};

void SubSystem3::run()
{
    
    
    cout << "子系统3运行" << endl;
}

class Facade{
    
    
private:
    SubSystem1 *sys1;
    SubSystem2 *sys2;
    SubSystem3 *sys3;
public:
    Facade();
    ~Facade();
    void run();
};

Facade::Facade()
{
    
    
    sys1 = new SubSystem1;
    sys2 = new SubSystem2;
    sys3 = new SubSystem3;
}

Facade::~Facade()
{
    
    
    if (sys1 != NULL)
    {
    
    
        delete sys1;
    }

    if (sys2 != NULL)
    {
    
    
        delete sys2;
    }

    if (sys3 != NULL)
    {
    
    
        delete sys3;
    }
}

void Facade::run()  //三个子系统同时执行才能完成这个功能
{
    
    
    sys1->run();
    sys2->run();
    sys3->run();
}

int main()
{
    
    
    Facade *aFacade = new Facade;
    aFacade->run();     

    delete aFacade;    

    return 0;
}

简单案例二

假设现有一家庭影院,有两种模式:

KTV模式:电视打开、灯关闭、音响打开、麦克风打开、DVD打开

游戏模式:电视打开、影响打开、游戏机打开、麦克风打开

void TV::turn_on(void)
{
    
    
    cout << "电视打开" << endl;
}

void TV::turn_off(void)
{
    
    
    cout << "电视关闭" << endl;
}

class Light
{
    
    
public:
    void turn_on(void);
    void turn_off(void);
};

void Light::turn_on(void)
{
    
    
    cout << "灯打开" << endl;
}

void Light::turn_off(void)
{
    
    
    cout << "灯关闭" << endl;
}

class Sound
{
    
    
public:
    void turn_on(void);
    void turn_off(void);
};

void Sound::turn_on(void)
{
    
    
    cout << "音响打开" << endl;
}

void Sound::turn_off(void)
{
    
    
    cout << "音响关闭" << endl;
}

class Microphone
{
    
    
public:
    void turn_on(void);
    void turn_off(void);
};

void Microphone::turn_on(void)
{
    
    
    cout << "麦克风打开" << endl;
}

void Microphone::turn_off(void)
{
    
    
    cout << "麦克风关闭" << endl;
}

class DVD
{
    
    
public:
    void turn_on(void);
    void turn_off(void);
};

void DVD::turn_on(void)
{
    
    
    cout << "DVD打开" << endl;
}

void DVD::turn_off(void)
{
    
    
    cout << "DVD关闭" << endl;
}

class Games
{
    
    
public:
    void turn_on(void);
    void turn_off(void);
};

void Games::turn_on(void)
{
    
    
    cout << "游戏机打开" << endl;
}

void Games::turn_off(void)
{
    
    
    cout << "游戏机关闭" << endl;
}

class KtvFacadeMode {
    
    
private:
    TV *mTv;
    DVD *mDvd;
    Sound *mSound;
    Light *mLight;
    Microphone *mMic;
    Games *mGames;
public:
    KtvFacadeMode();
    ~KtvFacadeMode();
    void run();
};

KtvFacadeMode::KtvFacadeMode()
{
    
    
    mTv     = new TV;
    mDvd    = new DVD;
    mSound  = new Sound;
    mLight  = new Light;
    mMic    = new Microphone;
    mGames  = new Games;
}

KtvFacadeMode::~KtvFacadeMode()
{
    
    
    if (mTv != NULL){
    
    
        delete mTv;
    }
    if (mDvd != NULL){
    
    
        delete mDvd;
    }
    if (mSound != NULL){
    
    
        delete mSound;
    }
    if (mLight != NULL) {
    
    
        delete mLight;
    }
    if (mMic != NULL) {
    
    
        delete mMic;
    }
    if (mGames != NULL){
    
    
        delete mGames;
    }
}

void KtvFacadeMode::run()
{
    
    
    mTv->turn_on();
    mLight->turn_off();
    mSound->turn_on();
    mMic->turn_on();
    mDvd->turn_on();
}

class GameFacadeMode{
    
    
private:
    TV *mTv;
    DVD *mDvd;
    Sound *mSound;
    Light *mLight;
    Microphone *mMic;
    Games *mGames;
public:
    GameFacadeMode();
    ~GameFacadeMode();
    void run();
};

GameFacadeMode::GameFacadeMode()
{
    
    
    mTv     = new TV;
    mDvd    = new DVD;
    mSound  = new Sound;
    mLight  = new Light;
    mMic    = new Microphone;
    mGames  = new Games;
}

GameFacadeMode::~GameFacadeMode()
{
    
    
    if (mTv != NULL) {
    
    
        delete mTv;
    }
    if (mDvd != NULL){
    
    
        delete mDvd;
    }
    if (mSound != NULL){
    
    
        delete mSound;
    }
    if (mLight != NULL) {
    
    
        delete mLight;
    }
    if (mMic != NULL) {
    
    
        delete mMic;
    }
    if (mGames != NULL){
    
    
        delete mGames;
    }
}

void GameFacadeMode::run()
{
    
    
    mTv->turn_on();
    mLight->turn_on();
    mSound->turn_on();
    mGames->turn_on();
}
int main()
{
    
    
    string modeSelect;

    KtvFacadeMode *aKtvFacade = new KtvFacadeMode;
    GameFacadeMode *aGameFacade = new GameFacadeMode;

    while(1)
    {
    
    
        cin >> modeSelect;
        if (modeSelect == "KTV")
        {
    
    
            aKtvFacade->run();
        }
        else if (modeSelect == "Game")
        {
    
    
            aGameFacade->run();
        }
        else
        {
    
    
            cout << "退出系统" << endl;
            break;
        }
    }

    delete aKtvFacade;
    delete aGameFacade;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36413982/article/details/108382717
今日推荐