C++设计模式---外观模式

外观模式是一种比较简单并且常用的设计模式,其本质就是增加中间层,从而实现类与类之间的接口隔离。


外观模式的使用场景

我们的游戏中通常会有游戏配置等设置,比如图形特效、背景声音、声音大小等设置。
这些类的对象用户通常只需要一个,所以我们可以采用单例模式来实现。
但是有时候我们需要根据用户的电脑型号,来决定是否将这些设置开启到最高,这也就意味着,我们需要调用每一个单例模式,有点麻烦。
在这里插入图片描述
我们可以考虑在这些单例模式与用户中间增加一个新的类,用来帮我们实现根据用户的电脑型号自动设置游戏配置的功能。

#include <iostream>
using namespace std;

namespace hjl_project1
{
    //图形相关类
    class graphic
    {
        //-------------单件类实现相关begin--------------
    private:
        graphic(){};
        graphic(const graphic &tmpobj);
        graphic &operator=(const graphic &tmpobj);
        ~graphic(){};

    public:
        static graphic &getInstance()
        {
            static graphic instance;
            return instance;
        }
        //-------------单件类实现相关end--------------

    public:
        void display(bool enable) //是否全屏显示(true:是)
        {
            cout << "图形->是否全屏显示->" << enable << endl;
            //其他代码略......
        }
        void effect(bool enable) //是否开启特效(true:是)
        {
            cout << "图形->是否开启特效->" << enable << endl;
        }
        void resolution(int index) //设置窗口分辨率
        {
            cout << "图形->分辨率设置选项->" << index << endl;
        }
        void antialiasing(bool enable) //是否开启抗锯齿(true:是)
        {
            cout << "图形->是否开启抗锯齿->" << enable << endl;
        }
        //....其他接口略
    };

    //声音相关类
    class sound
    {
        //-------------单件类实现相关begin--------------
    private:
        sound(){};
        sound(const sound &tmpobj);
        sound &operator=(const sound &tmpobj);
        ~sound(){};

    public:
        static sound &getInstance()
        {
            static sound instance;
            return instance;
        }
        //-------------单件类实现相关end--------------

    public:
        void bgsound(bool enable) //是否开启背景声音(true:是)
        {
            cout << "声音->是否开启背景声音->" << enable << endl;
        }
        void envirsound(bool enable) //是否开启环境音效(true:是)
        {
            cout << "声音->是否开启环境音效->" << enable << endl;
        }
        void expsound(bool enable) //是否开启表情声音(true:是)
        {
            cout << "声音->是否开启表情声音->" << enable << endl;
        }
        void setvolume(int level) //音量大小设置(0-100)
        {
            cout << "声音->音量大小为->" << level << endl;
        }
        //......其他接口略
    };

    //语音聊天相关类
    class chatvoice
    {
        //-------------单件类实现相关begin--------------
    private:
        chatvoice(){};
        chatvoice(const chatvoice &tmpobj);
        chatvoice &operator=(const chatvoice &tmpobj);
        ~chatvoice(){};

    public:
        static chatvoice &getInstance()
        {
            static chatvoice instance;
            return instance;
        }
        //-------------单件类实现相关end--------------

    public:
        void micvolume(int level) //麦克风音量大小设置(0-100)
        {
            cout << "语音聊天->麦克风音量大小为->" << level << endl;
        }
        void micsens(int level) //麦克风灵敏度设置(0-100)
        {
            cout << "语音聊天->麦克风灵敏度为->" << level << endl;
        }
        void chatvolume(int level) //聊天音量设置(0-100)
        {
            cout << "语音聊天->聊天音量为->" << level << endl;
        }
        //......其他接口略
    };
    //-----------------------
    //扮演外观模式角色的类
    class conffacade
    {
        //-------------单件类实现相关begin--------------
    private:
        conffacade(){};
        conffacade(const conffacade &tmpobj);
        conffacade &operator=(const conffacade &tmpobj);
        ~conffacade(){};

    public:
        static conffacade &getInstance()
        {
            static conffacade instance;
            return instance;
        }

    public:
        void LowConfComputer() //对于低配置电脑,只开启一些低配置选项
        {
            graphic &g_gp = graphic::getInstance();
            g_gp.display(true); //全屏耗费资源更低
            g_gp.effect(false);
            g_gp.resolution(2);
            g_gp.antialiasing(false);

            sound &g_snd = sound::getInstance();
            g_snd.bgsound(false);
            g_snd.envirsound(false);
            g_snd.expsound(false);
            g_snd.setvolume(15);

            chatvoice &g_cv = chatvoice::getInstance();
            g_cv.micvolume(20);
            g_cv.micsens(50);
            g_cv.chatvolume(60);
        }

        void HighConfComputer() //对于高配置电脑,能达到最好效果的项全部开启
        {
            graphic &g_gp = graphic::getInstance();
            g_gp.display(false);
            g_gp.effect(true);
            g_gp.resolution(0);
            g_gp.antialiasing(true);

            sound &g_snd = sound::getInstance();
            g_snd.bgsound(true);
            g_snd.envirsound(true);
            g_snd.expsound(true);
            g_snd.setvolume(50);

            chatvoice &g_cv = chatvoice::getInstance();
            g_cv.micvolume(100);
            g_cv.micsens(100);
            g_cv.chatvolume(100);
        }
    };
}

int main()
{
    hjl_project1::graphic &g_gp = hjl_project1::graphic::getInstance();
    g_gp.display(false);
    g_gp.effect(true);
    g_gp.resolution(2);
    g_gp.antialiasing(false);

    cout << "---------------" << endl;
    hjl_project1::sound &g_snd = hjl_project1::sound::getInstance();
    g_snd.setvolume(80);
    g_snd.envirsound(true);
    g_snd.bgsound(false);

    cout << "---------------" << endl;
    hjl_project1::chatvoice &g_cv = hjl_project1::chatvoice::getInstance();
    g_cv.chatvolume(70);
    g_cv.micsens(65);
    return 0;
}

在这里插入图片描述

在这里插入图片描述

外观模式的定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口,让子系统更容易使用。

外观模式体现了“迪米特法则”,也就是一个对象应该贵其他对象尽可能少的了解,从而降低对象之间的耦合,提高系统的可维护性。

外观模式有两个角色:外观角色和子系统角色(业务类)。

外观角色一次就控制子系统中的一群接口,缺少灵活性。所以如果有必要的话,也可以绕过外观角色直接访问子系统。
外观模式为客户端和子系统之间提供了一种简化的交互渠道,但并没有为子系统增加新的行为。如果希望增加新的行为,则需要修改子系统。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也要写bug、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值