北京首钢建设有限公司网站海沧网站制作

张小明 2026/3/12 14:29:55
北京首钢建设有限公司网站,海沧网站制作,网站后台上传word,小程序代理公司哪家好#x1f4b8; 前言#xff1a;被 if-else 支配的恐惧 场景还原#xff1a; 老板#xff1a;“小王#xff0c;今天把微信支付接进来。” 小王#xff1a;“好勒#xff01;” 于是写了一个 pay() 方法。 老板#xff1a;“明天把支付宝也接进来。” 小王#xff1a;“… 前言被if-else支配的恐惧场景还原老板“小王今天把微信支付接进来。”小王“好勒” 于是写了一个pay()方法。老板“明天把支付宝也接进来。”小王“没问题” 于是把pay()方法改成了if(channelWECHAT){// 微信验签、调用、处理...}elseif(channelALIPAY){// 支付宝验签、调用、处理...}老板“下周我们要出海接一下 PayPal 和 Stripe。”小王看着那坨已经 500 行的if-else代码陷入了沉思……这就是典型的“缺乏抽象能力”。支付业务虽然通道不同但核心流程是惊人一致的参数校验(Validate)生成签名(Sign)发送 HTTP 请求(Call API)处理响应(Handle Response)统一记录日志(Log)针对这种**“流程固定但细节不同”**的场景模板方法模式就是唯一的真神。 核心原理定义骨架下放细节模板方法模式的核心思想是在父类中定义一个final的主流程方法骨架将具体的步骤延迟到子类去实现。类图设计AbstractPaymentChannelpay(Request req) : void#validate(Request req) : void#sign(Request req) : String#callApi(Request req, String sign) : Response#handleResponse(Response resp) : void-log() : voidWechatChannel#validate()#sign()#callApi()#handleResponse()AlipayChannel#validate()#sign()#callApi()#handleResponse()️ 代码实战重构支付网关1. 定义抽象基类 (The Skeleton)这是整个模式的灵魂。注意doPay方法必须是final的防止子类篡改流程。publicabstractclassAbstractPaymentChannel{// 核心模板方法定义了支付的标准流程publicfinalPaymentResponsedoPay(PaymentRequestrequest){// 1. 通用日志logInfo(开始处理支付请求,request);// 2. 参数校验 (抽象步骤)if(!validate(request)){thrownewBizException(参数校验失败);}// 3. 加签 (抽象步骤)Stringsignaturesign(request);// 4. 调用三方接口 (抽象步骤)StringrawResponsecallApi(request,signature);// 5. 解析响应 (抽象步骤)PaymentResponseresponseparseResponse(rawResponse);// 6. 通用后置处理postProcess(response);returnresponse;}// --- 抽象方法强制子类实现 ---protectedabstractbooleanvalidate(PaymentRequestrequest);protectedabstractStringsign(PaymentRequestrequest);protectedabstractStringcallApi(PaymentRequestrequest,Stringsign);protectedabstractPaymentResponseparseResponse(StringrawResponse);// --- 通用方法子类复用 ---privatevoidlogInfo(Stringmsg,Objectdata){// 统一的日志记录逻辑System.out.println(msg: data);}// --- 钩子方法 (Hook)子类可选择性覆盖 ---protectedvoidpostProcess(PaymentResponseresponse){// 默认什么都不做}}2. 实现微信支付通道 (Concrete Class)ServicepublicclassWechatPaymentChannelextendsAbstractPaymentChannel{Overrideprotectedbooleanvalidate(PaymentRequestrequest){System.out.println(✅ 微信渠道校验 OpenID 是否必填);returnStringUtils.hasText(request.getExtra(openId));}OverrideprotectedStringsign(PaymentRequestrequest){System.out.println( 微信渠道使用 MD5 进行签名);returnSecureUtil.md5(request.toString());}OverrideprotectedStringcallApi(PaymentRequestrequest,Stringsign){System.out.println( 微信渠道调用 https://api.mch.weixin.qq.com/...);returnxml...SUCCESS.../xml;}OverrideprotectedPaymentResponseparseResponse(StringrawResponse){System.out.println( 微信渠道解析 XML 响应);returnnewPaymentResponse(SUCCESS,200);}}3. 实现支付宝通道 (Concrete Class)ServicepublicclassAlipayPaymentChannelextendsAbstractPaymentChannel{Overrideprotectedbooleanvalidate(PaymentRequestrequest){System.out.println(✅ 支付宝渠道校验 BuyerId);returntrue;}OverrideprotectedStringsign(PaymentRequestrequest){System.out.println( 支付宝渠道使用 RSA2 进行签名);returnSecureUtil.rsa2(request.toString());}// ... 其他步骤实现}4. 配合工厂模式使用最后我们需要一个简单工厂 (Simple Factory)或者策略模式 (Strategy)的 Map 来分发请求。ComponentpublicclassPaymentChannelFactory{AutowiredprivateMapString,AbstractPaymentChannelchannelMap;publicAbstractPaymentChannelgetChannel(StringchannelCode){// channelMap 会自动注入所有 Beankey 为 beanName// 例如wechatPaymentChannel - WechatPaymentChannelreturnchannelMap.get(channelCodePaymentChannel);}} 进阶技巧钩子方法 (Hook) 的妙用有时候某个特定的渠道需要特殊的步骤。比如只有银联支付需要在支付完成后发送短信通知用户。我们不需要修改doPay主流程只需要利用钩子方法。在基类中// 默认为空实现protectedvoidpostProcess(PaymentResponseresponse){}在银联子类中OverrideprotectedvoidpostProcess(PaymentResponseresponse){if(SUCCESS.equals(response.getStatus())){smsService.send(您的银联支付已成功);}}这就是“开闭原则” (Open-Closed Principle) 的完美体现对扩展开放对修改关闭。 总结从if-else到模板方法模式不仅仅是代码行数的变化更是思维方式的跃迁。复用性公共逻辑日志、异常处理、埋点全部收敛在父类改一处所有通道生效。扩展性接新通道新建一个类继承父类即可老代码一行都不用动测试风险极低。规范性父类通过final关键字强制定义了业务的标准流程新人想乱写都难。写出机器能跑的代码是门槛写出人能维护的代码才是本事。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

基层机构网站建设国际重大新闻事件2023

基于SpringBoot的停车库管理预约系统设计与实现 第一章 系统开发背景与现实意义 随着城市机动车保有量激增,停车库“一位难求”与资源闲置并存的矛盾日益突出:车主临时找位耗时久、无效绕行加剧拥堵;停车库缺乏精准预约机制,高峰时…

张小明 2026/3/5 2:29:56 网站建设

提供网站建设备案公司建筑施工图纸培训班

Python版本管理架构:PATH操纵与进程间通信机制解析 【免费下载链接】pyenv Simple Python version management 项目地址: https://gitcode.com/GitHub_Trending/py/pyenv 问题场景:多版本Python环境的管理困境 在跨版本Python开发过程中&#xf…

张小明 2026/3/5 2:29:57 网站建设

四川建设发展股份有限公司网站如何给网站加cdn

如何5分钟实现日文游戏实时汉化:免费翻译工具完整指南 【免费下载链接】TsubakiTranslator 一款Galgame文本翻译工具,支持Textractor/剪切板/OCR翻译 项目地址: https://gitcode.com/gh_mirrors/ts/TsubakiTranslator 还在为看不懂日文游戏剧情而…

张小明 2026/3/5 2:30:00 网站建设

网站霸词怎么做百度主页入口

LangFlow危机公关声明生成器 在一场突如其来的数据泄露事件中,企业的黄金响应时间往往只有4小时。然而现实中,大多数公司仍依赖层层会议、邮件往来和人工撰写来起草公关声明——等文案终于出炉,舆情早已失控。 有没有可能让AI在几分钟内生成一…

张小明 2026/3/5 2:30:00 网站建设

手机端网站制作一家只做性价比的网站

在B2B制造行业里,我们常常被“只要努力就一定会有回报”这样的信念所影响,销售人员每天会拨打100个电话,工程师会加班加点地修改图纸,老板则全年没有休息日地去拜访客户,可是到了年底进行算账的时候,就会发…

张小明 2026/3/5 2:38:06 网站建设

网站建设公司 石景山百度指数数据分析报告

AI之PhoneAgent:Open-AutoGLM的简介、安装和使用方法、案例应用之详细攻略 目录 Open-AutoGLM的简介 1、特点 2、时间线 Open-AutoGLM的安装和使用方法 1、安装 环境准备: 部署准备工作: 启动模型服务: 选项 A: 使用第三…

张小明 2026/3/5 2:30:07 网站建设