《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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/235900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3原生方法滚动列表

效果图 代码 import { ref, onBeforeUnmount, onUnmounted } from "vue"; //定时器初始化 let timer ref(null); //ref绑定初始化 let roll ref(null); //等同于vue2中的beforeDestroy onBeforeUnmount(() > {//清除定时器clearTimeout(timer.value); }); //等同…

简单实现Spring容器(二) 封装BeanDefinition对象放入Map

阶段2: // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.思路: 1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是 key[beanName]–value[beanDefintion…

【图对比学习】GACN:使用对抗网络增强图对比学习

#论文题目&#xff1a;Graph Contrastive Learning with Generative Adversarial Network&#xff08;使用对抗网络增强图对比学习&#xff09; #论文地址&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3580305.3599370 #论文源码开源地址&#xff1a;暂无 #论文所属会议&am…

如何公网访问内网的群晖NAS随时随地远程访问本地存储的学习资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

超卓航科引领冷喷涂增材制造革新,推动先进核反应堆发展

近日&#xff0c;超卓航科凭借其卓越的冷喷涂增材制造技术&#xff0c;成为推动核能领域创新的重要力量。该公司利用冷喷涂工程技术&#xff0c;或为核反应堆的制造和修复开辟了全新的道路。 冷喷涂技术是一种颇具前景的固态粉末沉积方法&#xff0c;可用于涂层制造、增材制造和…

【日志技术】附Logback入门教程

文章目录 日志概论日志的体系Logback快速入门日志配置文件配置日志级别 日志概论 什么是日志&#xff1f;其实可以通过下面几个问题来了解的。 系统系统能记住某些数据被谁操作&#xff0c;比如被谁删除了&#xff1f;想分析用户浏览系统的具体情况&#xff0c;比如挖掘用户的…

脱碱软化树脂Tulsimer CXO-5 MP 高盐水除钙镁树脂

一、产品介绍 Tulsimer CXO-5 MP 是一款大孔弱酸性丙烯酸系阳离子交换树脂&#xff0c;能除去水中的碱度和硬度&#xff0c;特别是除去水中的碳酸氢盐、碳酸盐及其它碱性盐类&#xff0c;适合运用于纯水 ,脱碱软化及选择性的去除重金属。适合在宽广的 pH 及温度范围情况下操作…

数据结构之单链表(不带头单向非循环链表)

一.引言 上一节我们学过了顺序表&#xff0c;那么我们想想顺序表有没有问题呢&#xff1f;我们来讨论顺序表的问题及思考。 顺序表问题&#xff1a; 1.中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会…

Go语言基础知识学习(一)

Go基本数据类型 bool bool型值可以为true或者false,例子&#xff1a; var b bool true数值型 类型表示范围int8有符号8位整型-128 ~ 127int16有符号16位整型-32768 ~ 32767int32有符号32位整型-2147783648 ~ 2147483647int64有符号64位整型uint8无符号8位整型0 ~ 255uint16…

使用CLion进行cuda编程,并使用cuda-gdb对核函数进行debug,这可能是全网你能够找到的最详细的CLion和cuda编程环境配置教程了

文章目录 前言一、环境准备二、相关学习资料三、环境配置1.新建Clion C Executable项目2.在Clion中的ToolChains中配置cuda-gdb3.配置CMake options4.配置CMakeLists.txt(1) Failed to compute shorthash for libnvrtc.so(2) c: error: unrecognized command-line option -G(3)…

【华为数据之道学习笔记】3-2 基础数据治理

基础数据用于对其他数据进行分类&#xff0c;在业界也称作参考数据。基础数据通常是静态的&#xff08;如国家、币种&#xff09;&#xff0c;一般在业务事件发生之前就已经预先定义。它的可选值数量有限&#xff0c;可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…

AI PC行业深度研究报告:AI PC革新端侧AI交互体验

今天分享的人工智能系列深度研究报告&#xff1a;《AI PC行业深度研究报告&#xff1a;AI PC革新端侧AI交互体验》。 &#xff08;报告出品方&#xff1a;华创证券&#xff09; 报告共计&#xff1a;28页 点击添加图片描述&#xff08;最多60个字&#xff09;编辑 一、硬件端…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

【SpringBoot教程】SpringBoot 实现前后端分离的跨域访问(CORS)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

xtts和ogg不选择?

不选择ogg的理由&#xff1a; 1.需要在源端创建用户赋权&#xff0c;启用数据库最小日志&#xff0c;附加日志等操作--对生产影响较大 2.外键约束过多&#xff0c;割接启用可能很慢https://www.modb.pro/db/201126--割接停机时间影响 3.初始化配置expdp导出可能快照过旧&#x…

基于Java swing的医院信息管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

秒级监控、精准迅速:全面保障业务可用性 | 开源日报 No.101

louislam/uptime-kuma Stars: 41.1k License: MIT Uptime Kuma 是一个易于使用的自托管监控工具&#xff0c;主要功能和核心优势包括&#xff1a; 监控 HTTP(s) / TCP / HTTP(s) 关键词 / HTTP(s) Json 查询 / Ping / DNS 记录等服务的可用性提供时尚、响应迅速且良好用户体验…

docker配置连接harbor私有仓库

一、前言 以下分为两种情况说明docker对harbor私有仓库的访问配置&#xff0c;一种是harbor使用自建证书配置https&#xff0c;一种是使用公有证书配置https 二、docker配置 harbor使用自建证书的情况 使用自建证书对harbor进行https配置&#xff0c;docker会将该仓库识别成不…

客服工单系统推荐:哪个最适合您?

客服工单系统是企业的业务过程的“保安”&#xff0c;保障业务流程的顺利开展&#xff0c;同时保障企业客户的权益。所以&#xff0c;市场上有越来越多的企业纷纷配置了客服工单系统&#xff0c;以提供客户服务质量。 对于有购买意向的中小企业来讲&#xff0c;需要关注哪些因…

pycharm中py文件设置参数

在py文件中右键 直接对应复制进去即可
最新文章