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

国外好的网站广州市白云区建设局网站

国外好的网站,广州市白云区建设局网站,宁波在线网,苏州有哪些做网站引言 在代码开发的世界里#xff0c;理论知识的重要性毋庸置疑#xff0c;但实战经验往往才是知识的真正试金石。正所谓#xff0c;“读万卷书不如行万里路”#xff0c;理论的学习需要通过实践来验证和深化。设计模式作为软件开发中的重要理论#xff0c;其真正的价值在…引言 在代码开发的世界里理论知识的重要性毋庸置疑但实战经验往往才是知识的真正试金石。正所谓“读万卷书不如行万里路”理论的学习需要通过实践来验证和深化。设计模式作为软件开发中的重要理论其真正的价值在于它们在解决实际问题时的应用。之前的一篇文章中我们通过物流系统引入了策略工厂方法模式感兴趣的读者可以去阅读Java设计模式实战从If-Else到策略工厂方法的演变本文将再通过支付系统来展示策略模式观察者模式命令模式组合模式的混合模式在实际开发中的应用。 本文不仅是对设计模式的理论讲解更是一次深入实战的探索。无论你是一名经验丰富的开发者还是刚入行的新手看一遍肯定记不住请记得收藏本文相信一定会为你在未来工作中引入设计模式提供一份参考 目录 案例分析 支付系统概述关键功能面临的挑战 初始代码 定义Payment实体类定义PaymentSystemService接口定义PaymentSystemServiceImpl实现类模拟调用 初始代码存在的问题分析引入策略模式 策略模式介绍引入策略模式后的代码引入策略模式后存在的问题分析 引入观察者模式 观察者模式介绍引入观察者模式后的代码引入观察者模式后存在的问题分析 引入命令组合模式 命令及组合模式介绍引入命令组合模式后的代码引入命令组合模式后的分析 混合模式设计的系统优势写在最后 案例分析 支付系统概述 简单来说支付系统需要处理多种支付方式还要与其他系统组件比如风控、营销等系统进行交互是比较复杂且难以设计的一类系统。我们就以支付系统为例引入混合设计模式来优化 关键功能 多渠道支付处理支持多种支付渠道如信用卡、电子钱包、银行转账等。用户可以根据自己的偏好选择合适的支付方式支付状态跟踪需要跟踪和管理每笔交易的状态确保交易的顺利完成风控通知在支付过程中系统需要与风控等系统交互确保交易的安全性日志记录系统应记录所有关键的支付信息用于审计和故障排查组合支付支持系统应支持组合支付即允许用户在一次交易中使用多种支付方式 面临的挑战 高耦合度不同支付渠道的处理逻辑紧密耦合使得系统难以适应新支付方式的添加或现有方式的修改通知机制不灵活支付完成后的通知机制如风控通知和日志记录固定且不易扩展难以适应多变的业务需求组合支付复杂性支持组合支付(比如 余额银行卡)增加了系统的复杂性尤其是在处理多种支付方式的交互和状态管理时维护和扩展困难由于系统的复杂性和高耦合度新功能的添加和现有功能的维护变得困难和风险较高 在接下来的部分中我们将探讨如何通过引入策略模式、观察者模式和命令及组合模式的混合模式来解决这些挑战提高支付系统的灵活性、可扩展性和可维护性 初始代码 ①定义Payment实体类: import java.math.BigDecimal; import java.util.List; import java.util.ArrayList;class Payment {String paymentType;BigDecimal amount;Payment(String paymentType, BigDecimal amount) {this.paymentType paymentType;this.amount amount;} }②定义PaymentSystemService接口 import java.util.List;public interface PaymentSystemService {void processPayments(ListPayment payments); }③定义PaymentSystemServiceImpl实现类 public class PaymentSystemServiceImpl implements PaymentSystemService {Overridepublic void processPayments(ListPayment payments) {// 处理支付processPaymentMethod(payments);// 支付完成后的通知notifyRiskManagement(payments);// 上报埋点日志logTransactions(payments);}private void processPaymentMethod(ListPayment payments) {for (Payment payment : payments) {switch (payment.paymentType) {case CreditCard:System.out.println(Processing credit card payment: payment.amount);break;case PayPal:System.out.println(Processing PayPal payment: payment.amount);break;// 其他支付方式...}}}// 通知风控private void notifyRiskManagement(ListPayment payments) {System.out.println(Notifying risk management for payment.);}// 日志埋点private void logTransactions(ListPayment payments) {for (Payment payment : payments) {System.out.println(Logging transaction: Payment type: payment.paymentType , Amount: payment.amount);}} }④模拟调用 public class Main {public static void main(String[] args) {PaymentSystemService paymentService new PaymentSystemServiceImpl();// 示例组合支付ListPayment combinedPayments new ArrayList();combinedPayments.add(new Payment(CreditCard, new BigDecimal(50.0)));combinedPayments.add(new Payment(PayPal, new BigDecimal(25.0)));paymentService.processPayments(combinedPayments);// 示例单一支付// ListPayment singlePayment new ArrayList();// singlePayment.add(new Payment(CreditCard, new BigDecimal(75.0)));// paymentService.processPayments(singlePayment);} }初始代码存在的问题分析 在上述的初始实现中PaymentSystemServiceImpl 类直接处理了所有的支付逻辑。这种实现方式存在几个主要问题 高耦合度支付逻辑直接与 PaymentSystemServiceImpl 类耦合使得该类承担了过多的责任。每种支付方式的逻辑都集中在一个类中违反了单一职责原则扩展性差添加或修改支付方式都需要修改 PaymentSystemServiceImpl 类这违反了开闭原则通知机制僵化支付完成后的通知机制如风控通知和日志记录与支付逻辑紧密耦合缺乏灵活性。难以适应不断变化的业务需求必如需要增加新的通知类型或修改通知流程 为了解决这些问题我们第一时间可以考虑引入策略模式来处理不同支付方式的逻辑使得每种支付方式都有自己的策略类解决这个主要问题 引入策略模式 策略模式介绍 策略模式是一种行为设计模式它定义了一系列算法并将每一个算法封装起来使它们可以互换。策略模式让算法的变化独立于使用算法的客户 在支付系统中我们可以定义一个支付策略接口每种支付方式实现这个接口。PaymentSystemServiceImpl 类可以使用这些策略来处理不同的支付方式而不是直接实现所有支付逻辑 引入策略模式后的代码 ①定义策略接口PaymentStrategy以及具体的策略类CreditCardPaymentStrategy…: import java.math.BigDecimal;/*** 定义支付策略的接口。*/ public interface PaymentStrategy {/*** 检查此策略是否适用于指定的支付类型。** param paymentType 支付类型* return 如果策略适用于该支付类型则返回 true*/boolean appliesTo(String paymentType);/*** 处理支付。** param amount 支付金额*/void processPayment(BigDecimal amount); }/*** 信用卡支付策略。*/ public class CreditCardPaymentStrategy implements PaymentStrategy {Overridepublic boolean appliesTo(String paymentType) {return CreditCard.equals(paymentType);}Overridepublic void processPayment(BigDecimal amount) {System.out.println(Processing credit card payment: amount);// 实现信用卡支付逻辑} }/*** PayPal支付策略。*/ public class PayPalPaymentStrategy implements PaymentStrategy {Overridepublic boolean appliesTo(String paymentType) {return PayPal.equals(paymentType);}Overridepublic void processPayment(BigDecimal amount) {System.out.println(Processing PayPal payment: amount);// 实现PayPal支付逻辑} }②修改PaymentSystemServiceImpl类 public class PaymentSystemServiceImpl implements PaymentSystemService {private ListPaymentStrategy paymentStrategies;public setPaymentStrategy(ListPaymentStrategy paymentStrategies) {this.paymentStrategies paymentStrategies;}Overridepublic void processPayments(ListPayment payments) {for (Payment payment : payments) {// 匹配策略PaymentStrategy strategy paymentStrategies.stream().filter(s - s.appliesTo(payment.paymentType)).findFirst().orElseThrow(() - new IllegalArgumentException(No strategy found for payment type: payment.paymentType));strategy.processPayment(payment.amount);}// 支付完成后的通知notifyRiskManagement(payments);logTransactions(payments);}// ... notifyRiskManagement and logTransactions methods ... }③模拟调用 public class Main {public static void main(String[] args) {// 构造策略ListPaymentStrategy strategies new ArrayList();strategies.add(new CreditCardPaymentStrategy());strategies.add(new PayPalPaymentStrategy());// 注入策略PaymentSystemService paymentService new PaymentSystemServiceImpl();paymentService.setPaymentStrategy(stategies);// 模拟组合支付场景ListPayment payments new ArrayList();payments.add(new Payment(CreditCard, new BigDecimal(50.0)));payments.add(new Payment(PayPal, new BigDecimal(25.0)));paymentService.processPayments(payments);} }引入策略模式后存在的问题分析 先看下当前代码的类图结构 这个类图包括以下部分 PaymentSystemService 接口定义了处理支付的方法PaymentSystemServiceImpl 类实现了 PaymentSystemService 接口并使用策略模式处理支付PaymentStrategy 接口定义了支付策略的方法CreditCardPaymentStrategy 和 PayPalPaymentStrategy 类实现了 PaymentStrategy 接口分别表示信用卡和PayPal的支付策略 存在的问题点 通知机制僵化该问题依然存在如果后续需要新增比如财务记账通知需要修改PaymentSystemService显然违背了单一职责策略管理复杂性尽管观察者模式优化了通知机制但支付策略的管理如策略的选择和执行仍然是 PaymentSystemServiceImpl 类的责任这可能导致策略管理复杂组合支付处理不足当前的实现可能不足以优雅地处理组合支付场景即在单次交易中使用多种支付方式。这需要更复杂的逻辑来协调不同支付方式的处理 因此我们考虑一个个问题依次解决先引入观察者模式以便解耦PaymentSystemServiceImpl类与通知通知交给具体的观察者即可。这样可以用于实现更灵活的通知机制后续可以动态添加或修改观察者 引入观察者模式 观察者模式介绍 观察者模式是一种行为设计模式它定义了对象之间的一对多依赖关系使得当一个对象改变状态时所有依赖于它的对象都会得到通知并自动更新。这种模式非常适合实现事件处理系统。 在观察者模式中存在两类主要角色 主题Subject维护一系列观察者提供用于注册和注销观察者的接口观察者Observer提供一个更新接口用于接收来自主题的通知 引入策略模式后的代码 import java.math.BigDecimal; import java.util.List; import java.util.ArrayList;// 观察者接口 interface Observer {void update(Payment payment); }// 主题接口 interface Subject {// 注册观察者void registerObserver(Observer o);// 移除观察者void removeObserver(Observer o);// 通知观察者void notifyObservers(Payment payment); }// 支付策略接口 interface PaymentStrategy {boolean appliesTo(String paymentType);void processPayment(BigDecimal amount); }// 具体的支付策略实现 class CreditCardPaymentStrategy implements PaymentStrategy {Overridepublic boolean appliesTo(String paymentType) {return CreditCard.equals(paymentType);}Overridepublic void processPayment(BigDecimal amount) {System.out.println(Processing credit card payment: amount);} }class PayPalPaymentStrategy implements PaymentStrategy {Overridepublic boolean appliesTo(String paymentType) {return PayPal.equals(paymentType);}Overridepublic void processPayment(BigDecimal amount) {System.out.println(Processing PayPal payment: amount);} }// 支付服务实现类 class PaymentSystemServiceImpl implements PaymentSystemService, Subject {private ListObserver observers new ArrayList();private ListPaymentStrategy paymentStrategies;public PaymentSystemServiceImpl(ListPaymentStrategy paymentStrategies) {this.paymentStrategies paymentStrategies;}Overridepublic void processPayments(ListPayment payments) {for (Payment payment : payments) {PaymentStrategy strategy paymentStrategies.stream().filter(s - s.appliesTo(payment.paymentType)).findFirst().orElseThrow(() - new IllegalArgumentException(No strategy found for payment type: payment.paymentType));strategy.processPayment(payment.amount);notifyObservers(payment);}}Overridepublic void registerObserver(Observer o) {observers.add(o);}Overridepublic void removeObserver(Observer o) {observers.remove(o);}Overridepublic void notifyObservers(Payment payment) {for (Observer observer : observers) {observer.update(payment);}} }// 支付类 class Payment {String paymentType;BigDecimal amount;Payment(String paymentType, BigDecimal amount) {this.paymentType paymentType;this.amount amount;} }// 风控系统观察者 class RiskManagementObserver implements Observer {Overridepublic void update(Payment payment) {System.out.println(Risk Management notified for payment: payment.amount);// 实现风控逻辑notifyRiskManagement(payment);}private void notifyRiskManagement(Payment payment) {// 风控通知逻辑} }// 日志系统观察者 class LoggingObserver implements Observer {Overridepublic void update(Payment payment) {System.out.println(Logging payment transaction: payment.amount);// 实现日志记录逻辑logTransaction(payment);}private void logTransaction(Payment payment) {// 日志记录逻辑} }// 主方法 public class Main {public static void main(String[] args) {ListPaymentStrategy strategies new ArrayList();strategies.add(new CreditCardPaymentStrategy());strategies.add(new PayPalPaymentStrategy());PaymentSystemServiceImpl paymentService new PaymentSystemServiceImpl(strategies);paymentService.registerObserver(new RiskManagementObserver());paymentService.registerObserver(new LoggingObserver());ListPayment payments new ArrayList();payments.add(new Payment(CreditCard, new BigDecimal(50.0)));payments.add(new Payment(PayPal, new BigDecimal(25.0)));paymentService.processPayments(payments);} }引入观察者模式后存在的问题分析 引入观察者模式后的类图 组合支付的时序流程图 引入观察者模式后解决的问题 解耦通知机制 观察者模式将支付完成后的通知逻辑如风控通知和日志记录从 PaymentSystemServiceImpl 类中解耦出来。每个观察者负责处理特定的响应逻辑降低了主类的复杂性 提高灵活性和可扩展性 通过观察者模式可以轻松添加或移除观察者无需修改主类的代码。这使得在支付系统中引入新的通知类型如财务记账通知变得更加简单 更好地遵循单一职责原则 观察者模式使得每个类包括主类和观察者都专注于单一的职责提高了代码的可维护性 引入观察者模式后仍存在的问题 策略管理复杂性问题依然存在尽管观察者模式优化了通知机制但支付策略的管理如策略的选择和执行仍然是 PaymentSystemServiceImpl 类的责任这可能导致策略管理复杂 组合支付处理不足问题依然存在当前的实现可能不足以优雅地处理组合支付场景即在单次交易中使用多种支付方式。这需要更复杂的逻辑来协调不同支付方式的处理 解决策略 对于第一个问题之前有介绍过用工厂方法模式解决感兴趣的读者可以去阅读Java设计模式实战从If-Else到策略工厂方法的演变本篇文章我们换一种模式用命令模式来解决(很多设计模式其实都可以相互替换)对于第二个问题我们可以考虑引入组合模式。组合模式可以用于优雅地处理组合支付场景允许将多个支付方式组合成一个支付请求。这样我们可以将组合支付的逻辑从 PaymentSystemServiceImpl 类中分离出来进一步提高系统的灵活性和可维护性 引入命令组合模式 命令及组合模式介绍 命令模式适用于管理和封装支付策略的执行逻辑。可以将支付操作封装为命令对象使得支付处理逻辑与执行逻辑分离提高代码的可重用性和可维护性。有助于实现撤销undo和重做redo等操作增加系统的灵活性组合模式适用于处理组合支付场景即在单次交易中使用多种支付方式。允许客户端以统一的方式处理单个支付组合支付简化了客户端的使用。提高了代码的结构清晰度和可扩展性 引入命令组合模式后的代码 import java.math.BigDecimal; import java.util.List; import java.util.ArrayList;// 观察者接口 interface Observer {void update(BigDecimal amount); }// 主题接口 interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers(BigDecimal amount); }// 命令接口 interface PaymentCommand {void execute(); }// 具体的支付命令 class ConcretePaymentCommand implements PaymentCommand {private PaymentStrategy strategy;private BigDecimal amount;private Subject subject;ConcretePaymentCommand(PaymentStrategy strategy, BigDecimal amount, Subject subject) {this.strategy strategy;this.amount amount;this.subject subject;}Overridepublic void execute() {strategy.processPayment(amount);subject.notifyObservers(amount);} }// 支付策略接口 interface PaymentStrategy {void processPayment(BigDecimal amount); }// 具体的支付策略 class CreditCardPaymentStrategy implements PaymentStrategy {Overridepublic void processPayment(BigDecimal amount) {System.out.println(Processing credit card payment: amount);} }class PayPalPaymentStrategy implements PaymentStrategy {Overridepublic void processPayment(BigDecimal amount) {System.out.println(Processing PayPal payment: amount);} }// 支付组件接口组合模式 interface PaymentComponent {void processPayment(); }// 单一支付叶子节点 class SinglePayment implements PaymentComponent {private PaymentCommand command;SinglePayment(PaymentCommand command) {this.command command;}Overridepublic void processPayment() {command.execute();} }// 组合支付复合节点 class CompositePayment implements PaymentComponent {private ListPaymentComponent payments new ArrayList();void addPayment(PaymentComponent payment) {payments.add(payment);}Overridepublic void processPayment() {for (PaymentComponent payment : payments) {payment.processPayment();}} }// 支付服务实现同时作为主题 class PaymentSystemServiceImpl implements Subject {private ListObserver observers new ArrayList();Overridepublic void registerObserver(Observer o) {observers.add(o);}Overridepublic void removeObserver(Observer o) {observers.remove(o);}Overridepublic void notifyObservers(BigDecimal amount) {for (Observer observer : observers) {observer.update(amount);}}void processPayments(PaymentComponent paymentComponent) {paymentComponent.processPayment();} }// 观察者实现 class RiskManagementObserver implements Observer {Overridepublic void update(BigDecimal amount) {System.out.println(Risk Management notified for payment: amount);} }class LoggingObserver implements Observer {Overridepublic void update(BigDecimal amount) {System.out.println(Logging payment transaction: amount);} }// 主方法 public class Main {public static void main(String[] args) {PaymentSystemServiceImpl paymentService new PaymentSystemServiceImpl();paymentService.registerObserver(new RiskManagementObserver());paymentService.registerObserver(new LoggingObserver());PaymentStrategy creditCardStrategy new CreditCardPaymentStrategy();PaymentStrategy payPalStrategy new PayPalPaymentStrategy();SinglePayment creditCardPayment new SinglePayment(new ConcretePaymentCommand(creditCardStrategy, new BigDecimal(50.0), paymentService));SinglePayment payPalPayment new SinglePayment(new ConcretePaymentCommand(payPalStrategy, new BigDecimal(25.0), paymentService));CompositePayment compositePayment new CompositePayment();compositePayment.addPayment(creditCardPayment);compositePayment.addPayment(payPalPayment);paymentService.processPayments(compositePayment);} }引入命令组合模式后的分析 现在完整的类图 这个类图包括以下部分 Observer 和 Subject 接口分别表示观察者和主题的基本结构PaymentCommand和ConcretePaymentCommand 类实现命令模式。 PaymentStrategy 接口及其具体实现类CreditCardPaymentStrategy 和 PayPalPaymentStrategy表示不同的支付策略PaymentComponent 接口及其实现类 SinglePayment 和 CompositePayment体现组合模式PaymentSystemServiceImpl 类实现了 Subject 接口同时处理支付命令RiskManagementObserver 和 LoggingObserver 类作为观察者实现特定的通知逻辑 混合模式设计的系统优势 增强的灵活性和可扩展性 策略模式允许动态更换支付逻辑适应新的支付方式命令模式通过将请求封装为对象提供了根据不同情况使用不同请求的灵活性组合模式使客户端能以统一方式处理单一支付和组合支付简化客户端使用 解耦和模块化 观察者模式将通知逻辑从主业务逻辑中解耦简化了通知类型的添加和修改策略模式和命令模式的应用进一步解耦了支付处理逻辑增强了模块化 提高代码的可维护性 模式的应用降低了系统的整体复杂性使代码更清晰易维护系统的不同部分可以独立变化减少了相互间的影响 更好地遵循软件设计原则 混合模式设计遵循了单一职责原则、开放封闭原则等提高了系统的可测试性和可靠性 通过这种混合模式设计支付系统不仅变得更加灵活和可扩展而且更易于管理和维护。这为应对不断变化的业务需求和技术挑战提供了坚实的基础 写在最后 比起写代码写文章确实很难一方面时间精力有限一方面难以直接将工作代码放在这里只能自己去编写示例难免会有疏漏可能不是特别准确。但总体相信一定可以给你带来一些思想上的启发。 通过混合使用策略模式、命令模式、组合模式和观察者模式成功地构建了一个灵活、可扩展且易于维护的支付系统。这种设计不仅提高了系统的模块化和解耦还优化了支付处理和通知机制确保了代码的清晰性和可维护性。这些模式的结合展示了如何有效地应对复杂系统设计中的常见挑战同时保持代码的整洁性与扩展性 希望这篇文章能够为你提供有价值的见解并帮助你在未来的项目中应用这些设计模式。 我是程序员三毛如果您觉得这篇文章对您有帮助请不吝点赞、关注和收藏。您的支持是我不断前进的动力 程序员三毛
http://www.yayakq.cn/news/5615/

相关文章:

  • 宝路华手表官方网站沧州手机建站哪家好
  • 怎么做无损mp3下载网站手机wordpress怎么保存图片大小
  • 大连建站价格信息流优化师工作内容
  • 深圳企业网站建设服务商手机百度账号登录个人中心
  • 网站建设与维护aspwordpress添加前台登录
  • 安徽省建设厅网站证书查询wordpress 门户主题
  • 有哪个网站做策划方案的磁力猫搜索引擎入口官网
  • 产品经理兼职做网站报酬wordpress 主题 自定义
  • 网站版权问题岳池做网站电话
  • 企业网站建设和管理网站没收录要怎么做
  • 服装网站项目的设计方案wordpress图文直播插件
  • 建设一个网站选择的服务器有哪些好的做h5的网站
  • 网站后台不能添加内容静态网站有什么用
  • 模板网站如何做seo智能建站系统
  • 软件公司门户网站模板企业静态网站需要备案吗
  • 网站建设 总体思路wordpress带登陆主题
  • 网站建设费用申报做网站 橙色怎么搭配
  • 棋牌游戏网站建设网站的二次开发是什么意思
  • 咸宁住房和城乡规划建设局网站潍坊网站建设wancet
  • 信息技术制作网站首页紫金优化网站制作
  • 网站开发和编程有什么区别wordpress显示用户自定义
  • 什么网站可以做兼职销售windows系统做网站
  • 做彩票网站要多少钱阿里云域名注册官网登录
  • 大型网站技术架构演进与性能优化四川省建十五公司官网
  • 为网站优势知乎怎么申请关键词推广
  • asp图片源码网站公司响应式网站建设报价
  • 英网站建设有网站如何做淘宝客
  • 建设银行顺德分行网站刚做的网站怎么搜索不出来
  • 与铁路建设相关的网站湖北省建设交易协会网站
  • 大连做网站需要多少钱网站建设和源代码问题