定义

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
简而言之外观模式就是为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

案例

现在你家有KTV模式和游戏模式的所有的设备,但你现在需要一个个设备去操作才能实现不同的模式。实现一个 一键切换模式 的系统。
KTV模式:电视打开,灯关掉,音箱打开,麦克风打开,dvd打开
游戏模式:电视打开,音箱打开,游戏机打开。

思路:

电视、灯、音箱等都能看做成一个子系统。而外观类去一键操作这些子系统

结构图:

图片说明

#define CRT SECURE NO WARNINGS
#include<iostream>
#include<string>
using namespace std;
/***************************************************/
//电视机
class Television{
public:
    void On(){
        cout << "电视机打开..." << endl;
    }
    void Off(){
        cout << "电视机关闭..." << endl;
    }
};

//灯
class Light{
public:
    void On(){
        cout << "打开..." << endl;
    }
    void Off(){
        cout << "灯关闭..." << endl;
    }
};

//音箱
class Audio{
public:
    void On(){
        cout << "音响打开..." << endl;
    }
    void Off(){
        cout << "音响关闭.." << endl;
    }
};
//麦克风
class Mircophone{
public:
    void On(){
        cout << "麦克风打开..." << endl;
    }
    void Off(){
        cout << "麦克风关闭.." << endl;
    }
};

//DVD播放器
class DVDPlayer{
public:
    void On(){
        cout << "DVD播放器打开..." << endl;
    }
    void Off(){
        cout << "DVD播放器关闭..." << endl;
    }
};


/***************************************************/

class KTVMode {
public:
    Television* pTv; 
    Light* pLight;
    Audio* pAudio; 
    Mircophone* pMicrophone; 
    DVDPlayer* pDvd;
public:
    KTVMode(){
        pTv = new Television;
        pLight = new Light;
        pAudio = new Audio;
        pMicrophone = new Mircophone;
        pDvd = new DVDPlayer;
    }
    ~KTVMode() {
        delete pTv;
        delete pLight;
        delete pAudio;
        delete pMicrophone;
        delete pDvd;
    }

    void OnKTV() {
        pTv->On();
        pLight->Off();
        pAudio->On();
        pMicrophone->On();
        pDvd->On();
    }
    void UnKTV() {
        pTv->Off();
        pLight->On();
        pAudio->Off();
        pMicrophone->Off();
        pDvd->Off();
    }

};

void test01() {
    KTVMode* ktv = new KTVMode;
    ktv->OnKTV();
    delete ktv;
}


int main()
{
    test01();


    return 0;
}