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

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

外观模式.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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "C经典-设计模式"是一本非常重要的书籍,它详细介绍了23种常用的设计模式设计模式是指在软件开发中,经过实践证明有效的解决方案。这本书提供了大量的示例和实践案例,帮助读者理解并应用这些设计模式。 这本书的特点之一是提供了丰富的图示,通过图示直观地展示了设计模式的结构和关系。这对于理解和记忆设计模式非常有帮助。 这本书从简单到复杂地介绍了各种不同类型的设计模式,包括创建型、结构型和行为型设计模式。每种设计模式都包括了详细的定义、应用场景、解决方案和与其他模式的关系。这样的组织结构使得读者可以快速地了解并选择适合自己项目需求的设计模式。 "C经典-设计模式"还提供了大量的实例代码和案例分析,帮助读者更好地理解和应用设计模式。这些案例覆盖了各种不同的编程语言和开发环境,使得读者可以从不同的角度去理解设计模式。 总的来说,"C经典-设计模式"是一本极具价值的书籍,无论是对于初学者还是有经验的开发者都具有很大的帮助。通过学习和应用这些设计模式,读者可以提高软件开发的质量和效率,使得自己的代码更加灵活、可维护和可扩展。 ### 回答2: "C经典设计模式pdf" 是指《C++经典设计模式》这本书的电子版PDF文件。这本书是一本关于C++设计模式经典著作,对于C++开发者学习和应用设计模式非常有帮助。通过阅读这本书的PDF版本,可以更方便地学习和参考其中的内容。 该PDF文件包含了本书的全部内容,包括理论介绍、具体的设计模式实现案例和相关的示意图等。使用该PDF文件,可以将书籍随身携带,随时进行学习和查阅。无论是初学者还是经验丰富的开发者都可以通过研读该书,深入了解各种设计模式的原理和使用方法。 设计模式是一种解决常见软件设计问题的经验总结,它们提供了一套通用且可重复使用的解决方案。通过应用设计模式,我们可以使得我们的代码更加灵活、可扩展和易于维护。在C++开发中使用设计模式,不仅可以提升代码质量和性能,还可以提高开发效率和团队协作能力。 《C++经典设计模式》是一本深入浅出的教材,适合各个层次的C++开发者阅读。无论你是刚入门的初学者,还是已经有一定经验的开发者,都可以从书中学到很多有用的知识和技巧。通过阅读该书的PDF版,可以更便捷地学习和实践设计模式,提升自身的软件设计和编码能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值