如何运用GoF设计模式提升软件健壮性?场景与实现疑问
软件健壮性问题与GoF设计模式应用解析
一、体现软件健壮性问题的真实场景
- 输入验证场景:用户提交表单时输入不符合格式的手机号、邮箱等非法内容,系统未做校验直接崩溃,而非给出友好提示
- 网络异常场景:客户端调用后端API时突然断网,程序未捕获异常导致闪退,无重试或降级处理
- 资源耗尽场景:数据库连接池耗尽后,系统无法处理新请求,且没有触发降级策略(如返回默认数据)
- 依赖服务故障:调用第三方支付接口超时,程序未处理该异常,导致整个订单流程中断
- 非法数据场景:数据库存入超出字段长度的脏数据,读取时抛出未捕获的异常,引发服务异常
二、适用于解决健壮性问题的GoF设计模式
- 策略模式:针对不同错误类型定义对应的处理策略(如网络超时用重试策略、参数错误用提示策略),可灵活切换错误处理逻辑,避免大量
if-else判断 - 装饰器模式:在不修改核心业务代码的前提下,给Dao、Service等层的方法添加容错、重试的装饰层,增强健壮性
- 简单工厂模式:统一创建和管理异常对象,避免代码中零散
new Exception,便于统一维护异常信息和类型 - 观察者模式:系统出现异常时,自动通知监控、日志模块记录信息,同时触发降级、恢复等后续处理逻辑
- 状态模式:根据系统的错误状态(如连接超时、资源耗尽)切换不同运行状态,实现优雅降级,保障核心功能可用
三、Dao类异常处理的设计模式实践
原Dao代码
class Dao { ... public void timeout() { // some logic here throw new RunTimeException("This session is timeout"); } }
优化方案:用简单工厂模式统一管理Dao层异常
不需要为每个异常单独创建工厂,但可以通过简单工厂统一封装Dao层的异常创建逻辑,步骤如下:
- 定义Dao层专属的异常类,替代通用
RuntimeException,让异常语义更清晰:
class DaoSessionTimeoutException extends RuntimeException { public DaoSessionTimeoutException(String msg) { super(msg); } } class DaoConnectionException extends RuntimeException { public DaoConnectionException(String msg) { super(msg); } }
- 创建
DaoExceptionFactory统一生成异常:
class DaoExceptionFactory { public static DaoSessionTimeoutException createSessionTimeoutException() { return new DaoSessionTimeoutException("This session is timeout"); } public static DaoConnectionException createConnectionException(String msg) { return new DaoConnectionException(msg); } }
- 修改Dao类代码,通过工厂获取异常:
class Dao { ... public void timeout() { // some logic here throw DaoExceptionFactory.createSessionTimeoutException(); } }
方案优势
- 统一异常创建逻辑,后续修改异常信息或添加属性时无需修改业务代码
- 异常类型更具体,上层调用方可针对性捕获处理,提升系统容错能力
- 避免代码中零散创建异常,符合单一职责原则
内容的提问来源于stack exchange,提问作者atob
相关产品推荐
相关产品推荐

