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

介绍

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

实现

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;
}
相关推荐
千忧散11 分钟前
Unity Socket学习笔记 (三)TCP&UDP
笔记·学习·unity·c#
勤劳打代码34 分钟前
妙笔生花 —— Flutter 实现飞入动画
前端·flutter·设计模式
今天只学一颗糖37 分钟前
Linux学习笔记--触摸屏驱动
笔记·学习
Gin3871 小时前
mooc自动互评脚本笔记---2025年10月11日
笔记
NiKo_W1 小时前
Linux 进程通信——基于建造者模式的信号量
linux·设计模式·建造者模式·system v
rongqing20191 小时前
Google 智能体设计模式:探索与发现
人工智能·设计模式
蒙奇D索大2 小时前
【C语言加油站】C语言文件操作详解:从“流”的概念到文件的打开与关闭
c语言·开发语言·笔记·学习·改行学it
摇滚侠2 小时前
Spring Boot 3零基础教程,依赖管理机制,笔记06
spring boot·笔记·后端
聪明的笨猪猪3 小时前
Java Spring “事务” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
lingggggaaaa3 小时前
小迪安全学习笔记(一百零二讲)—— 漏扫项目篇&PoC开发&Yaml语法&插件一键生成&匹配结果&交互提取
笔记·学习·安全·网络安全·交互