外观模式

定义

外观模式(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;
}

全部评论

相关推荐

03-04 15:02
已编辑
南京大学 Java
3.3&nbsp;一面岗位:&nbsp;后台开发部门:&nbsp;腾讯云场景题偏多,没问项目,没手撕,时长半小时1.&nbsp;自我介绍2.&nbsp;Java基础:-&nbsp;Treemap&nbsp;&amp;&nbsp;HashMap区别-&nbsp;ArrayList,&nbsp;添加n个数(n较大),会发生什么(应该是想问ArrayList的扩容机制)-&nbsp;考虑扩容的情况下这个过程的复杂度多少(说明复杂度计算思路即可,不需要给出具体的复杂度)3.&nbsp;并发:-&nbsp;项目里怎么用多线程的(一开始答了具体场景,不过面试官想听的是线程池,Synchronized这些...)-&nbsp;volatile&nbsp;&amp;&nbsp;synchronized-&nbsp;这里还问了一个,不过忘了...-&nbsp;假设项目里用了很多synchronized拖慢了系统效率,让你重构项目,你怎么设计?&nbsp;(真不会,回了一个参考乐观锁的设计用版本号之类的,然后这个话题就过了)4.&nbsp;JVM-&nbsp;JVM垃圾回收,怎么判断对象有没有被引用?&nbsp;(可达性分析)-&nbsp;GC&nbsp;Root有哪些-&nbsp;遇到OOM怎么排查5.&nbsp;场景-&nbsp;设计一个数据结构,用于在搜索框中搜索人名(不知道是不是这个意思,答了字典树这个结构)-&nbsp;使用字典树存储的话空间复杂度是多少(同前面,给出计算思路就行,不需要具体的值)-&nbsp;问了下简历上项目的背景,项目的具体内容没问-&nbsp;项目里的难点/印象深刻的点,咋解决的-&nbsp;针对上一点提了一个发散性的场景题(让你设计个xxx,你的思路)然后反问,无手撕。---春招第一面,被场景设计问题拷打麻了,就当练习了,不敢奢望能过,后续随缘了3.4更新,已挂
_追梦旅人_:大家考虑深圳睿联不,我们正在春招,可在我主页看岗位,感兴趣可直接投递~
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务