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

设计模式:责任链模式示例

责任链模式可以应用于多种场景,下面是几个不同场景的例子,每个例子都包括完整的代码。

示例1:日志处理系统

在日志处理系统中,日志消息可以根据其严重性(错误、警告、信息)被不同级别的日志处理器处理。

abstract class Logger {public static int INFO = 1;public static int DEBUG = 2;public static int ERROR = 3;protected int level;protected Logger nextLogger;public void setNextLogger(Logger nextLogger) {this.nextLogger = nextLogger;}public void logMessage(int level, String message) {if (this.level <= level) {write(message);}if (nextLogger != null) {nextLogger.logMessage(level, message);}}abstract protected void write(String message);
}class ConsoleLogger extends Logger {public ConsoleLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("Standard Console::Logger: " + message);}
}class ErrorLogger extends Logger {public ErrorLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.err.println("Error Console::Logger: " + message);}
}class FileLogger extends Logger {public FileLogger(int level) {this.level = level;}@Overrideprotected void write(String message) {System.out.println("File::Logger: " + message);}
}public class ChainPatternDemo {private static Logger getChainOfLoggers() {Logger errorLogger = new ErrorLogger(Logger.ERROR);Logger fileLogger = new FileLogger(Logger.DEBUG);Logger consoleLogger = new ConsoleLogger(Logger.INFO);errorLogger.setNextLogger(fileLogger);fileLogger.setNextLogger(consoleLogger);return errorLogger;}public static void main(String[] args) {Logger loggerChain = getChainOfLoggers();loggerChain.logMessage(Logger.INFO, "This is an information.");loggerChain.logMessage(Logger.DEBUG, "This is a debug level information.");loggerChain.logMessage(Logger.ERROR, "This is an error information.");}
}

示例2:支付处理系统

在一个支付处理系统中,一个支付请求可以通过多种支付方式进行处理。

abstract class PaymentHandler {protected PaymentHandler successor;public void setSuccessor(PaymentHandler successor) {this.successor = successor;}public abstract void handlePayment(PaymentRequest request);
}class PaymentRequest {private double amount;public PaymentRequest(double amount) {this.amount = amount;}public double getAmount() {return amount;}
}class PaypalHandler extends PaymentHandler {@Overridepublic void handlePayment(PaymentRequest request) {if (request.getAmount() < 1000) {System.out.println("Paypal processed $" + request.getAmount());} else if (successor != null) {successor.handlePayment(request);}}
}class CreditCardHandler extends PaymentHandler {@Overridepublic void handlePayment(PaymentRequest request) {if (request.getAmount() < 5000) {System.out.println("Credit Card processed $" + request.getAmount());} else if (successor != null) {successor.handlePayment(request);}}
}class BankTransferHandler extends PaymentHandler {@Overridepublic void handlePayment(PaymentRequest request) {System.out.println("Bank Transfer processed $" + request.getAmount());}
}public class PaymentChainDemo {public static void main(String[] args) {PaymentHandler paypal = new PaypalHandler();PaymentHandler creditCard = new CreditCardHandler();PaymentHandler bankTransfer = new BankTransferHandler();paypal.setSuccessor(creditCard);creditCard.setSuccessor(bankTransfer);PaymentRequest request = new PaymentRequest(450);paypal.handlePayment(request);request = new PaymentRequest(1200);paypal.handlePayment(request);request = new PaymentRequest(6500);paypal.handlePayment(request);}
}

责任链模式在软件设计中非常通用,并且可以在许多不同的场景中找到应用。这些示例展示了责任链模式在处理具有不同处理级别或条件的请求时的灵活性和可扩展性。在实际应用中,责任链模式可以帮助我们创建更加模块化和可管理的代码,但也需要注意不要过度使用,避免不必要的复杂性。

相关文章:

  • 线上研讨会 | 新一代数字化技术赋能机器人及智能产线行业高质量发展
  • 2024 蓝桥打卡Day35
  • 算法训练营第35天|LeetCode 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球
  • Vue2 —— 学习(一)
  • JAVA POI Excel 使用数组公式 FREQUENCY
  • 2024.4.2力扣每日一题——所有可能的真二叉树
  • Word文档如何设置单选框、复选框、下拉框
  • python selenium向html中写入内容
  • Spring、SpringMVC、Springboot三者的区别和联系
  • 深入理解JVM后端优化技术-逃逸分析(Escape Analysis)
  • 【牛客SQL快速入门】SQL基础(一)
  • 蓝桥杯-网络安全比赛(5)基础学习-JavaScript原型链的prototype、constructor、object.create()、__proto__
  • go语言学习--2.函数
  • 为什么 MySQL 采用 B+ 树作为索引?
  • 网络协议——HTTP协议
  • ----------
  • 2019.2.20 c++ 知识梳理
  • 345-反转字符串中的元音字母
  • cookie和session
  • echarts的各种常用效果展示
  • Java 23种设计模式 之单例模式 7种实现方式
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js中的正则表达式入门
  • laravel 用artisan创建自己的模板
  • Laravel5.4 Queues队列学习
  • Node项目之评分系统(二)- 数据库设计
  • python_bomb----数据类型总结
  • 反思总结然后整装待发
  • 分布式熔断降级平台aegis
  • 给github项目添加CI badge
  • 构建工具 - 收藏集 - 掘金
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端存储 - localStorage
  • 手写一个CommonJS打包工具(一)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我看到的前端
  • 用Python写一份独特的元宵节祝福
  • kubernetes资源对象--ingress
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​业务双活的数据切换思路设计(下)
  • #微信小程序:微信小程序常见的配置传旨
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (十六)一篇文章学会Java的常用API
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ***监测系统的构建(chkrootkit )
  • ***检测工具之RKHunter AIDE
  • **PHP分步表单提交思路(分页表单提交)