网站设计字体大小规范上海市企业服务云
网站设计字体大小规范,上海市企业服务云,专业动画制作软件,wordpress如何修改不用邮箱注册在日常开发中#xff0c;你是否写过这样的业务逻辑#xff1a;
为了完成一个“用户注册”的功能#xff0c;你的 Controller 里硬生生地注入了 5 个不同的服务#xff1a;
UserService (存用户信息)、EmailService (发激活邮件)、ScoreService (送初始积分)、CouponService…在日常开发中你是否写过这样的业务逻辑为了完成一个“用户注册”的功能你的Controller里硬生生地注入了 5 个不同的服务UserService(存用户信息)、EmailService(发激活邮件)、ScoreService(送初始积分)、CouponService(发新人券)、LogService(记日志)。客户端前端或者调用方在调用时如果需要自己去挨个弄懂这 5 个服务怎么用、按什么顺序调那简直是噩梦。而且一旦底层服务有任何改动调用方就得跟着遭殃。为了拯救濒临崩溃的调用方我们需要一个“接待员”。这就是门面模式又叫外观模式。️ 一、技术分析迪米特法则的完美践行门面模式的核心思想极其简单为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口这个接口使得这一子系统更加容易使用。这完美契合了面向对象设计中的迪米特法则 (Law of Demeter)也就是“最少知识原则”一个对象应该对其他对象有最少的了解。1. 核心结构Facade (门面角色): 客户端直接调用的那个高层接口。它知道所有子系统的工作职责负责将客户端的请求委派给相应的子系统去处理。Subsystem (子系统角色): 真正干活的一群老黄牛。它们可以是类、模块或者更微小的服务。它们不知道门面的存在。对于子系统而言门面只是另一个普通的客户端而已。2. 改造代码没有门面时客户端的惨状A.doSomething(); B.doSomething(); C.doSomething();有了门面后客户端的惬意Facade.doEverything();(门面在内部帮你把 A、B、C 全调了一遍)。 二、故事场景智能家居的“睡眠模式”为了彻底搞懂门面模式的价值我们将复杂子系统比作家里的各种电器将门面比作智能音箱比如小爱同学。1. 场景设定目标: 你晚上准备睡觉了。子系统: 卧室大灯 (Light)、电视机 (TV)、空调 (AC)、智能窗帘 (Curtain)。2. 没有门面 (传统模式)你要睡觉了你需要亲自执行一系列操作走到门口按下开关关灯 (Light.turnOff())。找到电视遥控器关电视 (TV.turnOff())。找到空调遥控器开启睡眠模式 (AC.sleepMode())。走到窗边手动拉上窗帘 (Curtain.close())。痛点你客户端必须了解每一个电器子系统的操作方式强耦合极其繁琐。3. 有了门面 (Facade)你花 200 块钱买了一个智能音箱 (Facade)。智能音箱内部已经通过 WiFi 连接并学习了所有电器的控制指令。现在的你只需要躺在床上喊一句“小爱同学我要睡觉了。” (facade.sleepMode())小爱同学内部逻辑publicvoidsleepMode(){light.turnOff();tv.turnOff();ac.sleepMode();curtain.close();}结论对你而言电器的复杂性被完全屏蔽了。你不再需要和四个遥控器打交道你只和智能音箱这一个“门面”打交道。 三、实战框架中无处不在的“Facade”很多开发者觉得门面模式太简单不屑一顾。但其实它是顶级开源框架中最常用的架构手段。1. 日志门面SLF4J (Simple Logging Facade for Java)这是一个将门面模式写在名字里的经典框架。内部子系统有无数种日志实现Log4j、Logback、java.util.logging等。对于开发者来说你永远只需要面向SLF4J的 API 编程 (log.info())。SLF4J 作为门面帮你把具体的日志打印任务委派给底层的实现框架。就算你明天把 Logback 换成 Log4j你的业务代码一行都不用改。2. Tomcat 的 RequestFacade当你的 Servlet 收到 HTTP 请求时Tomcat 传给你的HttpServletRequest对象其实并不是 Tomcat 内部真正的Request核心对象而是一个RequestFacade包装类。为什么因为 Tomcat 内部的Request对象包含了太多容器级别的危险方法比如修改内部组件配置。为了安全Tomcat 用一个Facade挡在前面只暴露出你需要的方法如getParameter()把危险方法隐藏了起来。3. 三层架构本身就是门面经典的Controller - Service - DAO架构中。Service 层本质上就是底层的DAO 层数据库交互的门面。Controller 不允许直接调用多个 DAO 去拼接数据而是告诉 Service 你的意图由 Service 这个门面去协调各种 DAO 完成复杂的业务逻辑。 四、适配器 vs 代理 vs 门面这三个模式常常让人傻傻分不清记住它们的核心意图适配器 (Adapter): 为了“兼容”。把一个接口变成另一个接口解决新老代码冲突转换插头。代理 (Proxy): 为了“控制”。接口不变但在调用原对象前后加点私货比如鉴权、日志明星经纪人。门面 (Facade): 为了“简化”。把一堆复杂的接口封装成一个简单的高层接口屏蔽底层复杂度智能音箱总开关。 五、总结把复杂留给自己把简单交给别人门面模式是软件工程中封装思想的极致体现。它不仅降低了系统的耦合度提高了安全性底层组件对外部不可见最重要的是它极大地改善了API 的开发者体验 (DX)。