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

103、23种设计模式之外观模式(12/23)

一、定义

外观模式是一种结构型设计模式,通过引入一个外观类(Facade),为复杂子系统提供简化的统一接口。其核心思想是“门面”——客户端只需与外观类交互,无需直接操作子系统中的多个类,从而降低系统复杂度并解耦模块。

二、应用场景

1.复杂子系统简化

  • 当子系统包含多个相互依赖的模块(如数据库操作、文件处理、网络请求)时,外观模式可封装这些模块的调用流程,提供一键式操作。
  • 示例:电商系统下单需调用商品查询、库存扣减、订单生成、日志记录等子系统,外观类可封装这一流程为PlaceOrder()方法。

2.分层架构设计

  • 在经典三层架构(表现层、业务逻辑层、数据访问层)中,外观类可作为层间接口,减少跨层调用时的耦合。
  • 示例:业务逻辑层通过外观类调用数据访问层的多个DAO,而无需直接依赖具体实现。

3.遗留系统集成

  • 当维护旧系统时,可通过外观类为新功能提供清晰接口,避免直接修改遗留代码。
  • 示例:为老旧的支付系统封装外观类,新模块仅需调用ProcessPayment(),无需理解内部复杂逻辑。

4.多技术栈整合

  • 在微服务或混合架构中,外观模式可统一不同服务的调用方式。
  • 示例:通过外观类封装REST API、GraphQL和gRPC三种服务的调用细节。

三、优缺点

1.优点

  1. 简化调用:客户端无需了解子系统内部细节。
  2. 解耦模块:降低客户端与子系统的直接依赖。
  3. 提高可维护性:子系统变更仅影响外观类。

2.缺点

  1. 违背开闭原则:新增子系统需修改外观类代码。
  2. 过度简化风险:可能隐藏关键子系统功能,导致调试困难。
  3. 性能开销:额外封装层可能增加调用链耗时。

四、C# 示例代码

using System;// 子系统1:库存服务
public class InventoryService {public void CheckStock(string productId) {Console.WriteLine($"Checking stock for {productId}...");}
}// 子系统2:支付服务
public class PaymentService {public void ProcessPayment(decimal amount) {Console.WriteLine($"Processing payment of ${amount}...");}
}// 子系统3:订单服务
public class OrderService {public void CreateOrder(string customerId) {Console.WriteLine($"Creating order for customer {customerId}...");}
}// 外观类
public class OrderFacade {private InventoryService _inventory;private PaymentService _payment;private OrderService _order;public OrderFacade() {_inventory = new InventoryService();_payment = new PaymentService();_order = new OrderService();}// 统一下单接口public void PlaceOrder(string productId, decimal amount, string customerId) {_inventory.CheckStock(productId);_payment.ProcessPayment(amount);_order.CreateOrder(customerId);Console.WriteLine("Order placed successfully!");}
}// 客户端代码
public class Program {public static void Main() {var facade = new OrderFacade();facade.PlaceOrder("P123", 99.99m, "C456");}
}/* 输出:
Checking stock for P123...
Processing payment of $99.99...
Creating order for customer C456...
Order placed successfully!
*/

五、关键点总结

1.单一职责原则: 外观类仅负责协调子系统调用,不实现具体业务逻辑。
2. 最少知识原则(迪米特法则): 客户端仅与外观类交互,减少对子系统的直接依赖。
3. 与中介者模式的区别:

  • 外观模式关注外部与子系统的交互,中介者模式关注子系统内部的通信。

4. 与抽象工厂模式的结合:

  • 外观类可内部使用抽象工厂创建子系统实例,进一步解耦客户端与具体实现。

5. 适用场景扩展:

  • 在IoC容器或依赖注入框架中,外观模式可简化服务注册与调用流程。
  • 在GUI开发中,外观类可封装复杂控件的初始化逻辑(如创建图表时配置数据源、样式、交互事件)。

在这里插入图片描述


文章转载自:

http://QF15mTZA.fygLr.cn
http://dh7L5mUp.fygLr.cn
http://774Ljisv.fygLr.cn
http://HSV8TG6n.fygLr.cn
http://8mW6qWe4.fygLr.cn
http://uDOnlML0.fygLr.cn
http://leG8e5Sv.fygLr.cn
http://IqPOyamv.fygLr.cn
http://skqaKEsz.fygLr.cn
http://h5O9dQ8L.fygLr.cn
http://NFZK9SUD.fygLr.cn
http://Zk1A3Olb.fygLr.cn
http://pL66p6VP.fygLr.cn
http://kKjYCyv9.fygLr.cn
http://jmpYgwrc.fygLr.cn
http://3KOWKcy0.fygLr.cn
http://nweJ8N1x.fygLr.cn
http://SjljQKEG.fygLr.cn
http://GRFZDf9q.fygLr.cn
http://JiYyQ60d.fygLr.cn
http://CvSI6X1x.fygLr.cn
http://YlZulOHK.fygLr.cn
http://6aAhGRaw.fygLr.cn
http://k7vn2t1x.fygLr.cn
http://cP31APSG.fygLr.cn
http://Z9FLDyIM.fygLr.cn
http://6d3aHUrU.fygLr.cn
http://nR4rGdrn.fygLr.cn
http://hiDg2ERF.fygLr.cn
http://YBUSLYZd.fygLr.cn
http://www.dtcms.com/a/387930.html

相关文章:

  • 依赖注入基础
  • 代码随想录二刷之“图论”~GO
  • 基础数学转金融数学考研:一场需要清醒规划的转型
  • Alpha World携手非小号Talking Web3,海上ALPHA WEB3派对启航
  • Vue3钩子,路由拦截实现
  • 数据结构七大排序算法模拟实现性能分析
  • vue+react笔记
  • springboot获取wav文件音频长度
  • 【Redis】-- 缓存
  • 鸿蒙高效数据处理框架全攻略:缓存、并行与流式实战
  • 全网首发! Nvidia Jetson Thor 128GB DK 刷机与测评(五)常用功能测评 - RealtimeSTT 音频转文本 同声传译
  • OpenHarmony 之生态规则管控服务(Ecological Rule Manager Service)源码深度解读
  • 无人机图传是什么意思 应用和趋势是什么?
  • arm coresight
  • Vue3 + vue-draggable-plus 实现可拖拽的数据源选择面板
  • Vue 项目主题切换功能实现:两种方案详解与选型分析
  • 有些软件要求基础环境包含oneAPI组件时带有小版本怎么解释
  • Vue3 基础
  • 处理Element ui输入框类型为Number的时候,中文输入法下回车光标聚焦到了左上角
  • 企业级容器技术Docker 20250917总结
  • 智能艾灸机器人:科技激活千年养生智慧,开启中医现代化新篇章
  • Docker 镜像瘦身实战:从 1.2GB 压缩到 200MB 的优化过程——多阶段构建与 Alpine 的降维打击
  • Unity 性能优化之道(性能问题定位 | 渲染流程分析 | SSAO项优化 | AA优化 | 后处理优化)
  • 进阶内容——BYOT(自带模板,Bring Your Own Template)(99)
  • 算法 七大基于比较的排序算法
  • DeepSeek 分布式部署,配置
  • 蓝凌EKP产品:AI 高效汇总意见,加速决策落地​
  • 在三台GPU服务器上部署分布式deepseek
  • Cpptraj 终极指南:从入门到精通
  • Project Treble和HAL架构