《设计模式的艺术》笔记 - 外观模式

介绍

外观模式中外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

实现

myclass.h

cpp 复制代码
//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <vector>

class SubSystemA {
public:
    void methodA();
};

class SubSystemB {
public:
    void methodB();
};

class Facade {
public:
    Facade();
    ~Facade();
    void method();

private:
    SubSystemA *m_subA;
    SubSystemB *m_subB;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

cpp 复制代码
//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

void SubSystemA::methodA() {
    std::cout << "SubSystemA::methodA()" << std::endl;
}

void SubSystemB::methodB() {
    std::cout << "SubSystemB::methodB()" << std::endl;
}

Facade::Facade() {
    m_subA = new SubSystemA;
    m_subB = new SubSystemB;
}

Facade::~Facade() {
    if (m_subA) {
        delete m_subA;
    }
    if (m_subB) {
        delete m_subB;
    }
}

void Facade::method() {
    if (m_subA) {
        m_subA->methodA();
    }
    if (m_subB) {
        m_subB->methodB();
    }
}

main.cpp

cpp 复制代码
#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Facade *facade = new Facade();
    facade->method();

    return 0;
}

总结

优点

  1. 对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。

  2. 实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。

  3. 一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。

  4. 只是提供了一个访问子系统的统一入口,并不影响客户端直接使用子系统类。

缺点

  1. 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。

  2. 如果设计不当,增加新的子系统可能需要修改外观类的源代码,这违背了开闭原则。

练习

myclass.h

cpp 复制代码
//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <vector>

class AddressBook {
public:
    void moveTo(const std::string &path);
};

class MsgManager {
public:
    void moveTo(const std::string &path);
};

class BackupFacade {
public:
    BackupFacade();
    ~BackupFacade();
    void backup(const std::string &path);

private:
    AddressBook *m_addrBook;
    MsgManager *m_msgManager;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

cpp 复制代码
//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

void AddressBook::moveTo(const std::string &path) {
    std::cout << "将通讯录移动到" << path << std::endl;
}

void MsgManager::moveTo(const std::string &path) {
    std::cout << "将短信移动到" << path << std::endl;
}

BackupFacade::BackupFacade() {
    m_addrBook = new AddressBook;
    m_msgManager = new MsgManager;
}

BackupFacade::~BackupFacade() {
    if (m_addrBook) {
        delete m_addrBook;
    }
    if (m_msgManager) {
        delete m_msgManager;
    }
}

void BackupFacade::backup(const std::string &path) {
    std::cout << "------- 开始备份 ---------" << std::endl;
    if (m_addrBook) {
        m_addrBook->moveTo(path);
    }
    if (m_msgManager) {
        m_msgManager->moveTo(path);
    }
    std::cout << "------- 备份完成 ---------" << std::endl;
}

main.cpp

cpp 复制代码
#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    BackupFacade *facade = new BackupFacade();
    facade->backup("SD卡");

    return 0;
}
相关推荐
lgily-122514 分钟前
常用的设计模式详解
java·后端·python·设计模式
pedestrian_h1 小时前
Spring AI 开发本地deepseek对话快速上手笔记
java·spring boot·笔记·llm·ollama·deepseek
&Cheems1 小时前
ZYNQ笔记(二十):Clocking Wizard 动态配置
笔记·fpga开发
努力毕业的小土博^_^1 小时前
【深度学习|学习笔记】 Generalized additive model广义可加模型(GAM)详解,附代码
人工智能·笔记·深度学习·神经网络·学习
怪小庄吖1 小时前
7系列 之 I/O标准和终端技术
经验分享·笔记·fpga开发·硬件架构·硬件工程·xilinx 7系列 fpga·i/o标准和终端技术
chao_7892 小时前
手撕算法(定制整理版2)
笔记·算法
灰原A3 小时前
摆脱拖延症的详细计划示例
笔记
song_ly00110 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
DIY机器人工房11 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技
DanB2412 小时前
Java笔记4
java·开发语言·笔记