《C++新经典设计模式》之第8章 外观模式

《C++新经典设计模式》之第8章 外观模式

外观模式.cpp
cpp 复制代码
#include <iostream>
#include <memory>
using namespace std;

// 中间层角色,隔离接口,两部分模块通过中间层打交道
// 提供简单接口,不与底层直接打交道
// 提供统一接口,访问子系统中的一群接口
// 定义高层接口,让子系统更容易使用

// 迪米特法则
// 一个对象对其他对象的了解应尽可能少,降低对象间耦合,提高系统的可维护性

namespace ns1
{
    class graphic // 图形相关类
    {
        graphic(){};
        graphic(const graphic &tmpobj);
        graphic &operator=(const graphic &tmpobj);
        ~graphic(){};

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

    public:
        void display(bool enable) // 是否全屏显示(true:是)
        {
            cout << "full screen->" << enable << endl;
        }
        void effect(bool enable) // 是否开启特效(true:是)
        {
            cout << "special effects->" << enable << endl;
        }
        void resolution(int index) // 设置窗口分辨率
        {
            cout << "resolution ratio->" << index << endl;
        }
        void antialiasing(bool enable) // 是否开启抗锯齿(true:是)
        {
            cout << "anti-aliasing->" << enable << endl;
        }
    };

    class sound // 声音相关类
    {
        sound(){};
        sound(const sound &tmpobj);
        sound &operator=(const sound &tmpobj);
        ~sound(){};

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

    public:
        void bgsound(bool enable) // 是否开启背景声音(true:是)
        {
            cout << "background sound->" << enable << endl;
        }
        void envirsound(bool enable) // 是否开启环境音效(true:是)
        {
            cout << "environmental sound effect->" << enable << endl;
        }
        void expsound(bool enable) // 是否开启表情声音(true:是)
        {
            cout << "expressional voice->" << enable << endl;
        }
        void setvolume(int level) // 音量大小设置(0-100)
        {
            cout << "volume->" << level << endl;
        }
    };

    class chatvoice // 语音聊天相关类
    {
        chatvoice(){};
        chatvoice(const chatvoice &tmpobj);
        chatvoice &operator=(const chatvoice &tmpobj);
        ~chatvoice(){};

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

    public:
        void micvolume(int level) // 麦克风音量大小设置(0-100)
        {
            cout << "microphone volume->" << level << endl;
        }
        void micsens(int level) // 麦克灵敏度设置(0-100)
        {
            cout << "microphone sensitivity->" << level << endl;
        }
        void chatvolume(int level) // 聊天音量设置(0-100)
        {
            cout << "chat volume->" << level << endl;
        }
    };

    class conffacade // 扮演外观模式角色的类
    {
        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);
        }
    };
}

namespace ns2
{
    class Screen // 屏幕
    {
    public:
        void On() { cout << "screen on!" << endl; }
        void Off() { cout << "screen off!" << endl; }
    };

    class Light // 灯光
    {
    public:
        void On() { cout << "light open!" << endl; }
        void Off() { cout << "light close!" << endl; }
    };

    class Speaker // 音箱
    {
    public:
        void On() { cout << "speaker on!" << endl; }
        void Off() { cout << "speaker off!" << endl; }
    };

    class DvdPlayer // DVD播放器
    {
    public:
        void On() { cout << "dvd open!" << endl; }
        void Off() { cout << "dvd close!" << endl; }
    };

    class PlayerStation // 游戏机
    {
    public:
        void On() { cout << "playerstation on!" << endl; }
        void Off() { cout << "playerstation off!" << endl; }
    };

    class HomeTheaterFacade // 家庭影院外观模式类
    {
        Screen scnobj;
        Light lgobj;
        Speaker spkobj;
        DvdPlayer dpobj;
        PlayerStation psobj;

    public:
        void WatchMovie() // 看电影
        {
            // 屏幕打开,灯光熄灭,音箱打开,DVD播放器打开,游戏机关闭。
            scnobj.On();
            lgobj.Off();
            spkobj.On();
            dpobj.On();
            psobj.Off();
        }
        void PlayGame() // 玩游戏
        {
            // 屏幕打开,灯光打开,音箱打开,DVD播放器关闭,游戏机打开。
            scnobj.On();
            lgobj.On();
            spkobj.On();
            dpobj.Off();
            psobj.On();
        }
    };
}

namespace ns3
{
    class Shape
    {
    public:
        virtual ~Shape() = default;
        virtual void draw() const = 0;
    };

    class Rectangle : public Shape
    {
    public:
        void draw() const override { cout << "Rectangle::draw()" << endl; }
    };

    class Square : public Shape
    {
    public:
        void draw() const override { cout << "Square::draw()" << endl; }
    };

    class Circle : public Shape
    {
    public:
        void draw() const override { cout << "Circle::draw()" << endl; }
    };

    class ShapeMaker
    {
        shared_ptr<Shape> circle;
        shared_ptr<Shape> rectangle;
        shared_ptr<Shape> square;

    public:
        ShapeMaker()
        {
            circle = make_shared<Circle>();
            rectangle = make_shared<Rectangle>();
            square = make_shared<Square>();
        }
        void drawCircle() const { circle->draw(); }
        void drawRectangle() const { rectangle->draw(); }
        void drawSquare() const { square->draw(); }
    };
}

int main()
{
#if 0
    using namespace ns1;
    graphic &g_gp = graphic::getInstance();
    g_gp.display(false);
    g_gp.effect(true);
    g_gp.resolution(2);
    g_gp.antialiasing(false);
    cout << "---------------" << endl;
    sound &g_snd = sound::getInstance();
    g_snd.setvolume(80);
    g_snd.envirsound(true);
    g_snd.bgsound(false);
    cout << "---------------" << endl;
    chatvoice &g_cv = chatvoice::getInstance();
    g_cv.chatvolume(70);
    g_cv.micsens(65);
#endif

#if 0
    using namespace ns1;
    conffacade &g_cffde = conffacade::getInstance();
    cout << "Low-configuration computer" << endl;
    g_cffde.LowConfComputer();
    cout << "------------------" << endl;
    cout << "high-configuration computer" << endl;
    g_cffde.HighConfComputer();
#endif

#if 0
    ns2::HomeTheaterFacade htfacobj;
    cout << "movie---------------" << endl;
    htfacobj.WatchMovie();
    cout << "game---------------" << endl;
    htfacobj.PlayGame();
#endif

#if 1
    using namespace ns3;
    shared_ptr<ShapeMaker> shapeMaker(new ShapeMaker());
    shapeMaker->drawCircle();
    shapeMaker->drawRectangle();
    shapeMaker->drawSquare();
#endif

    cout << "Over!\n";
    return 0;
}
相关推荐
可均可可12 分钟前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
白子寰34 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
小芒果_0139 分钟前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
gkdpjj1 小时前
C++优选算法十 哈希表
c++·算法·散列表
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
-Even-1 小时前
【第六章】分支语句和逻辑运算符
c++·c++ primer plus
我是谁??1 小时前
C/C++使用AddressSanitizer检测内存错误
c语言·c++
发霉的闲鱼2 小时前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt2 小时前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
xiaoxiao涛2 小时前
协程6 --- HOOK
c++·协程