C++25设计模式之外观模式

在这里插入图片描述
图片引用于百度

简介:隐藏系统的复杂性,向外部提供一个可以访问的接口,即单实例类

优点:降低了客户端与子系统的耦合关系,让子类更加易用,外部只需要和外观类交互

缺点:增加子类可能会修改外观类,不符合开闭原则,而且不能很好的限制外部使用子类

例子背景:现在有人想要买一台主机,借用上一个代理模式的代码,用外观类实现人购买电脑的操作

外观模式代码:

  • 外观类:
#pragma once
#include "Producti7Mainframe.h"
#include "../Proxy/Proxy.h"

class Facade
{
private:
        shared_ptr<Proxy> m_proxy;
        shared_ptr<Producti7Mainframe> m_pimf;
private:
        Facade() {}
        ~Facade() = default;
        Facade(const Facade&) = delete;
        Facade(Facade&&) = delete;
        Facade& operator=(const Facade&) = delete;
        Facade& operator=(Facade&&) = delete;
public:
        void BuyI7Mainframe(People* people)
        {
                m_proxy->BuyMainFrame(people, m_pimf->CreateProduct());
        }
public:
        static Facade* GetInstance()
        {
                static Facade facade;
                return &facade;
        }
};
  • 人类:
#pragma once
#include "../Proxy/People.h"
#include <unordered_map>

class Peoples
{
private:
        Peoples()
        {
                m_peoples.insert(std::make_pair("张三", new People));
                m_peoples.insert(std::make_pair("李四", new People));
                m_peoples.insert(std::make_pair("王五", new People));
                auto zhangsan = m_peoples.at("张三");
                zhangsan->SetMoney(8000);
                zhangsan->SetName("张三");

                auto lisi = m_peoples.at("李四");
                lisi->SetMoney(20000);
                lisi->SetName("李四");

                auto wangwu = m_peoples.at("王五");
                wangwu->SetMoney(20000);
                wangwu->SetName("王五");
                wangwu->SetVip(true);
        }
        ~Peoples()
        {
                for (auto iter : m_peoples)
                {
                        delete iter.second;
                }
        }
        Peoples(const Peoples&) = delete;
        Peoples(Peoples&&) = delete;
        Peoples& operator=(const Peoples&) = delete;
        Peoples& operator=(Peoples&&) = delete;
private:
        unordered_map<std::string, People*> m_peoples;
public:
        People* GetPeople(const string& name) { return m_peoples.at(name); }
public:
        static Peoples* GetInstance()
        {
                static Peoples facade;
                return &facade;
        }
};
  • 产品类:
#pragma once
#include "../Decorator/i7Mainframe.h"
#include "../Decorator/AccessoriesHardDisk.h"
#include "../Decorator/AccessoriesMemoryBank.h"

class Producti7Mainframe
{
public:
        Producti7Mainframe() {}
        Mainframe* CreateProduct()
        {
                Mainframe* i7 = new i7Mainframe;
                Mainframe* ahd = new AccessoriesHardDisk(i7);
                Mainframe* amb = new AccessoriesMemoryBank(ahd);
                return amb;
        }
};
  • 引用:
#include "Facade.h"
#include "Peoples.h"

int main()
{
        Facade* fd = Facade::GetInstance();
        fd->BuyI7Mainframe(Peoples::GetInstance()->GetPeople("王五"));

        getchar();
        return 0;
}

总结:
外观模式(Facade):又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性

作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值