当前位置: 首页 > news >正文

外观模式_结构型_GOF23


外观模式

外观模式就像 “智能家居中控面板”——你不需要手动操作空调、灯光、窗帘等多个设备,只需点击一个“回家模式”按钮,系统就会自动完成所有设备的联动操作。它的核心思想是 通过统一接口隐藏复杂子系统的调用细节,让用户只需关注目标功能,而非底层实现。以下是外观模式的原理、实现方式及 C++/Python/Java 代码示例:


一、核心思想与生活类比
  1. 简化调用:用一个统一接口封装多个子系统的复杂调用流程。
    类比:餐厅点餐时,服务员(外观)代替顾客与厨师、配菜员、收银员等子系统交互。
  2. 降低耦合:客户端只依赖外观接口,不直接接触子系统,提高代码可维护性。
  3. 四大角色
    • 外观类(Facade):提供统一接口,协调子系统的调用(如中控面板)。
    • 子系统类(Subsystem):实现具体功能(如空调、灯光等设备)。
    • 客户端(Client):通过外观接口调用功能(如用户点击按钮)。

二、代码实现示例
场景:家庭影院一键观影(自动开启电视、音响、灯光调节)

C++ 实现
#include <iostream>
// 子系统:电视
class TV {
public:
    void turnOn() { std::cout << "电视已开启\n"; }
    void setMode(const std::string& mode) { std::cout << "电视模式:" << mode << "\n"; }
};

// 子系统:音响
class SoundSystem {
public:
    void enableSurround() { std::cout << "环绕声已开启\n"; }
};

// 子系统:灯光
class Lighting {
public:
    void dim(int level) { std::cout << "灯光调暗至" << level << "%\n"; }
};

// 外观类:家庭影院控制器
class HomeTheaterFacade {
private:
    TV tv;
    SoundSystem sound;
    Lighting lights;
public:
    void watchMovie() {
        tv.turnOn();
        tv.setMode("影院模式");
        sound.enableSurround();
        lights.dim(20);
        std::cout << ">>> 家庭影院准备就绪!\n";
    }
};

// 客户端调用
int main() {
    HomeTheaterFacade theater;
    theater.watchMovie();
    return 0;
}

输出

电视已开启  
电视模式:影院模式  
环绕声已开启  
灯光调暗至20%  
>>> 家庭影院准备就绪!

Python 实现
# 子系统:灯光
class Lighting:
    def adjust(self, brightness):
        print(f"灯光亮度调整为{brightness}%")

# 子系统:空调
class AirConditioner:
    def set_temperature(self, temp):
        print(f"空调温度设置为{temp}℃")

# 外观类:智能家居控制中心
class SmartHomeFacade:
    def __init__(self):
        self.light = Lighting()
        self.ac = AirConditioner()

    def evening_mode(self):
        self.light.adjust(30)
        self.ac.set_temperature(25)
        print(">>> 已切换至晚间舒适模式")

# 客户端调用
home = SmartHomeFacade()
home.evening_mode()

输出

灯光亮度调整为30%  
空调温度设置为25℃  
>>> 已切换至晚间舒适模式

Java 实现
// 子系统:音响
class Speaker {
    void powerOn() { System.out.println("音响启动"); }
    void setVolume(int level) { System.out.println("音量设置为" + level); }
}

// 子系统:投影仪
class Projector {
    void open() { System.out.println("投影仪启动"); }
}

// 外观类:会议室设备控制器
class MeetingRoomFacade {
    private Speaker speaker = new Speaker();
    private Projector projector = new Projector();

    public void startPresentation() {
        speaker.powerOn();
        speaker.setVolume(60);
        projector.open();
        System.out.println(">>> 会议演示模式已启动");
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        MeetingRoomFacade controller = new MeetingRoomFacade();
        controller.startPresentation();
    }
}

输出

音响启动  
音量设置为60  
投影仪启动  
>>> 会议演示模式已启动

三、外观模式核心优势与场景
优势应用场景案例
简化接口统一多个子系统的复杂调用流程电商订单系统(支付、库存、物流整合)
降低耦合客户端只依赖外观类,不直接接触子系统微服务架构中的API网关
提高可维护性子系统修改时只需调整外观类旧系统升级保留核心功能
分层架构定义系统分层的入口点操作系统驱动接口封装

四、注意事项与扩展技巧
  1. 避免过度简化
    外观类需平衡简化与灵活性,例如保留部分子系统的直接访问接口(如网页1中的getFileModule()方法)。
  2. 开闭原则的权衡
    新增子系统可能需要修改外观类(如添加新风系统到智能家居),可通过继承或组合扩展(如子外观类)。
  3. 与适配器模式对比
    适配器解决接口不兼容问题,外观模式解决接口复杂性问题(如网页1中的对比说明)。

总结:外观模式是代码世界的“一站式服务台”,通过封装复杂逻辑提供简洁接口。合理使用可显著提升代码的可读性和可维护性,尤其适合需要简化调用的多子系统场景。

http://www.dtcms.com/a/98815.html

相关文章:

  • 游戏引擎学习第192天
  • 第三卷:覆舟山决战(73-108回)正反人物群像
  • 习题1.43
  • 软件工程面试题(十一)
  • 【数据结构】队列
  • el-radio-group 中 el-radio-button value未能绑定上数值数据
  • 欢乐力扣:合并两个有序链表
  • Redis6数据结构之List类型
  • 25_闭包节流防抖
  • Gateway实战(三)、断言-时间、Cookie信息
  • 从零开始研发GPS接收机连载——16、接收天上卫星信号成功定位
  • Python之变量与数据类型总结
  • Linux C语言调用第三方库,第三方库如何编译安装
  • Android 12系统源码_输入系统(四)触摸异常问题排查
  • nginx 设置隐藏版本号
  • 【LangChain入门 9 Agent 】LangChain开发Agent智能体
  • 当模板方法模式遇上工厂模式:一道优雅的烹饪架构设计
  • 【Qt】ffmpeg编码—存储(H264)
  • 链路聚合技术
  • 基于Spring Boot的戒烟网站的设计与实现(LW+源码+讲解)
  • 每日OJ题_剑指offer数组篇(剑指offer04+剑指offer11+剑指offer21)
  • 深度学习 Deep Learning 第12章 深度学习的主流应用
  • python之kafka组件
  • 车辆vin码/车架号查询接口如何用Java实现
  • 数字内容体验提升用户参与策略
  • Java 求两个 List 集合的交集和差集
  • 交换综合实验
  • pycharm与python版本
  • 常见FPGA逻辑单元比较(仅参考)
  • 全国产1U机架式交换机解决方案