状态模式实战Row 对象状态机本文从真实 ORM 框架场景出发实现一套自动追踪数据状态、自动驱动 INSERT/UPDATE/DELETE的 Row 状态机代码简洁、鲁棒性强、可直接落地生产兼顾设计模式思想与工程最佳实践。文章目录状态模式实战Row 对象状态机一、场景与目标二、状态定义枚举化无魔法值三、状态流转规则标准状态机语义四、Row 完整实现生产级五、BaseDao 状态驱动持久化六、测试用例可直接运行七、设计模式本质1. 标准状态模式2. 本文轻量状态机最优实践八、亮点总结九、适用场景十、扩展方向生产进阶结语一、场景与目标在轻量级 ORM / 数据层框架中表格行 Row需要具备自动识别新增 / 修改 / 未修改 / 删除自动执行INSERT / UPDATE / DELETE 无需手动判断旧值备份支持审计追溯、增量更新状态安全禁止非法状态切换、异常防护最终实现调用方只管设值状态机全权负责行为。二、状态定义枚举化无魔法值/** * Row 数据行状态枚举 */publicenumRowState{/** 未修改无操作 */UNMODIFIED(0,未修改),/** 新增执行 INSERT */INSERT(1,新增),/** 修改执行 UPDATE */UPDATE(3,修改),/** 删除执行 DELETE */DELETE(4,删除);privatefinalintcode;privatefinalStringdesc;RowState(intcode,Stringdesc){this.codecode;this.descdesc;}publicintgetCode(){returncode;}publicStringgetDesc(){returndesc;}}三、状态流转规则标准状态机语义初始加载设置新字段修改已有字段继续修改继续修改标记删除标记删除标记删除已删除禁止修改UNMODIFIEDINSERTUPDATEDELETE当前状态操作目标状态行为UNMODIFIED新字段赋值INSERT标记为新增UNMODIFIED旧字段修改UPDATE备份旧值INSERT任意赋值INSERT保持新增UPDATE任意赋值UPDATE保持修改任意标记删除DELETE禁止再修改四、Row 完整实现生产级importjava.util.HashMap;importjava.util.Map;importjava.util.Objects;/** * 数据行对象轻量级状态机实现 */publicclassRow{// 当前状态privateRowStatestateRowState.UNMODIFIED;// 当前数据privatefinalMapString,ObjectdataMapnewHashMap();// 旧值备份审计/增量更新privatefinalMapString,ObjectoldDataMapnewHashMap();// 状态判断 publicbooleanisUnmodified(){returnRowState.UNMODIFIED.equals(state);}publicbooleanisInsert(){returnRowState.INSERT.equals(state);}publicbooleanisUpdate(){returnRowState.UPDATE.equals(state);}publicbooleanisDelete(){returnRowState.DELETE.equals(state);}// 核心状态驱动赋值 publicvoidsetItemValue(Objectkey,Objectvalue){Objects.requireNonNull(key,key cannot be null);Stringfieldkey.toString();ObjectoldValdataMap.get(field);// 删除状态禁止修改if(isDelete()){thrownewIllegalStateException(已删除行不可修改);}// 未修改状态才需要切换状态if(isUnmodified()){if(oldValnull){stateRowState.INSERT;}else{stateRowState.UPDATE;oldDataMap.putIfAbsent(field,oldVal);}}// 写入新值dataMap.put(field,value);}// 取值 publicObjectgetItemValue(Objectkey){returnkeynull?null:dataMap.get(key.toString());}publicStringgetItemStringValue(Objectkey){ObjectvgetItemValue(key);returnvnull?:v.toString();}// 状态操作 publicvoidmarkDelete(){this.stateRowState.DELETE;}publicvoidreset(){this.stateRowState.UNMODIFIED;this.oldDataMap.clear();}// Getter publicRowStategetState(){returnstate;}publicMapString,ObjectgetDataMap(){returnnewHashMap(dataMap);}publicMapString,ObjectgetOldDataMap(){returnnewHashMap(oldDataMap);}}五、BaseDao 状态驱动持久化/** * 基础 DAO状态自动决定 SQL 执行 */publicclassBaseDao{publicvoidsave(Rowrow){if(row.isInsert()){doInsert(row);}elseif(row.isUpdate()){doUpdate(row);}elseif(row.isDelete()){doDelete(row);}}protectedvoiddoInsert(Rowrow){System.out.println(INSERT row.getDataMap());row.reset();}protectedvoiddoUpdate(Rowrow){System.out.println(UPDATE new:row.getDataMap() old:row.getOldDataMap());row.reset();}protectedvoiddoDelete(Rowrow){System.out.println(DELETE row.getDataMap());row.reset();}}六、测试用例可直接运行publicclassRowTest{publicstaticvoidmain(String[]args){BaseDaodaonewBaseDao();RowrownewRow();// 新增row.setItemValue(id,1001);row.setItemValue(name,test);dao.save(row);// 修改row.setItemValue(name,updated);dao.save(row);// 删除row.markDelete();dao.save(row);// 已删除禁止修改try{row.setItemValue(name,fail);}catch(Exceptione){System.out.println(e.getMessage());}}}七、设计模式本质1. 标准状态模式State 接口 N 个实现类完全遵循开闭原则适合复杂状态机2. 本文轻量状态机最优实践枚举 内部状态判断无多余类、无过度设计适合状态少、流转固定的业务Row 场景核心一致状态决定行为而非调用方判断。八、亮点总结✅ 状态枚举化无魔法数字、可读性强✅ 自动状态流转调用方无感知✅ 旧值备份支持审计与增量更新✅ 删除状态防护禁止非法修改✅ 鲁棒性强空指针防护、状态安全✅ 极简代码可直接嵌入 ORM / 数据层✅ 符合状态模式思想不过度设计九、适用场景轻量级 ORM 框架表单数据自动保存表格编辑、行状态追踪数据审计日志低代码平台数据层十、扩展方向生产进阶实现 Serializable 支持分布式增加字段校验、类型安全批量赋值、批量状态重置字段级回滚基于 oldDataMap状态变更监听器 / 日志埋点与 Spring/JDBC/MyBatis 集成结语这套 Row 状态机是设计模式落地的典型案例不盲目套用教科书而是根据场景做极简工程化实现既保证模式思想又保证性能、可维护性与落地效率。
状态模式实战——Row对象的状态机
状态模式实战Row 对象状态机本文从真实 ORM 框架场景出发实现一套自动追踪数据状态、自动驱动 INSERT/UPDATE/DELETE的 Row 状态机代码简洁、鲁棒性强、可直接落地生产兼顾设计模式思想与工程最佳实践。文章目录状态模式实战Row 对象状态机一、场景与目标二、状态定义枚举化无魔法值三、状态流转规则标准状态机语义四、Row 完整实现生产级五、BaseDao 状态驱动持久化六、测试用例可直接运行七、设计模式本质1. 标准状态模式2. 本文轻量状态机最优实践八、亮点总结九、适用场景十、扩展方向生产进阶结语一、场景与目标在轻量级 ORM / 数据层框架中表格行 Row需要具备自动识别新增 / 修改 / 未修改 / 删除自动执行INSERT / UPDATE / DELETE 无需手动判断旧值备份支持审计追溯、增量更新状态安全禁止非法状态切换、异常防护最终实现调用方只管设值状态机全权负责行为。二、状态定义枚举化无魔法值/** * Row 数据行状态枚举 */publicenumRowState{/** 未修改无操作 */UNMODIFIED(0,未修改),/** 新增执行 INSERT */INSERT(1,新增),/** 修改执行 UPDATE */UPDATE(3,修改),/** 删除执行 DELETE */DELETE(4,删除);privatefinalintcode;privatefinalStringdesc;RowState(intcode,Stringdesc){this.codecode;this.descdesc;}publicintgetCode(){returncode;}publicStringgetDesc(){returndesc;}}三、状态流转规则标准状态机语义初始加载设置新字段修改已有字段继续修改继续修改标记删除标记删除标记删除已删除禁止修改UNMODIFIEDINSERTUPDATEDELETE当前状态操作目标状态行为UNMODIFIED新字段赋值INSERT标记为新增UNMODIFIED旧字段修改UPDATE备份旧值INSERT任意赋值INSERT保持新增UPDATE任意赋值UPDATE保持修改任意标记删除DELETE禁止再修改四、Row 完整实现生产级importjava.util.HashMap;importjava.util.Map;importjava.util.Objects;/** * 数据行对象轻量级状态机实现 */publicclassRow{// 当前状态privateRowStatestateRowState.UNMODIFIED;// 当前数据privatefinalMapString,ObjectdataMapnewHashMap();// 旧值备份审计/增量更新privatefinalMapString,ObjectoldDataMapnewHashMap();// 状态判断 publicbooleanisUnmodified(){returnRowState.UNMODIFIED.equals(state);}publicbooleanisInsert(){returnRowState.INSERT.equals(state);}publicbooleanisUpdate(){returnRowState.UPDATE.equals(state);}publicbooleanisDelete(){returnRowState.DELETE.equals(state);}// 核心状态驱动赋值 publicvoidsetItemValue(Objectkey,Objectvalue){Objects.requireNonNull(key,key cannot be null);Stringfieldkey.toString();ObjectoldValdataMap.get(field);// 删除状态禁止修改if(isDelete()){thrownewIllegalStateException(已删除行不可修改);}// 未修改状态才需要切换状态if(isUnmodified()){if(oldValnull){stateRowState.INSERT;}else{stateRowState.UPDATE;oldDataMap.putIfAbsent(field,oldVal);}}// 写入新值dataMap.put(field,value);}// 取值 publicObjectgetItemValue(Objectkey){returnkeynull?null:dataMap.get(key.toString());}publicStringgetItemStringValue(Objectkey){ObjectvgetItemValue(key);returnvnull?:v.toString();}// 状态操作 publicvoidmarkDelete(){this.stateRowState.DELETE;}publicvoidreset(){this.stateRowState.UNMODIFIED;this.oldDataMap.clear();}// Getter publicRowStategetState(){returnstate;}publicMapString,ObjectgetDataMap(){returnnewHashMap(dataMap);}publicMapString,ObjectgetOldDataMap(){returnnewHashMap(oldDataMap);}}五、BaseDao 状态驱动持久化/** * 基础 DAO状态自动决定 SQL 执行 */publicclassBaseDao{publicvoidsave(Rowrow){if(row.isInsert()){doInsert(row);}elseif(row.isUpdate()){doUpdate(row);}elseif(row.isDelete()){doDelete(row);}}protectedvoiddoInsert(Rowrow){System.out.println(INSERT row.getDataMap());row.reset();}protectedvoiddoUpdate(Rowrow){System.out.println(UPDATE new:row.getDataMap() old:row.getOldDataMap());row.reset();}protectedvoiddoDelete(Rowrow){System.out.println(DELETE row.getDataMap());row.reset();}}六、测试用例可直接运行publicclassRowTest{publicstaticvoidmain(String[]args){BaseDaodaonewBaseDao();RowrownewRow();// 新增row.setItemValue(id,1001);row.setItemValue(name,test);dao.save(row);// 修改row.setItemValue(name,updated);dao.save(row);// 删除row.markDelete();dao.save(row);// 已删除禁止修改try{row.setItemValue(name,fail);}catch(Exceptione){System.out.println(e.getMessage());}}}七、设计模式本质1. 标准状态模式State 接口 N 个实现类完全遵循开闭原则适合复杂状态机2. 本文轻量状态机最优实践枚举 内部状态判断无多余类、无过度设计适合状态少、流转固定的业务Row 场景核心一致状态决定行为而非调用方判断。八、亮点总结✅ 状态枚举化无魔法数字、可读性强✅ 自动状态流转调用方无感知✅ 旧值备份支持审计与增量更新✅ 删除状态防护禁止非法修改✅ 鲁棒性强空指针防护、状态安全✅ 极简代码可直接嵌入 ORM / 数据层✅ 符合状态模式思想不过度设计九、适用场景轻量级 ORM 框架表单数据自动保存表格编辑、行状态追踪数据审计日志低代码平台数据层十、扩展方向生产进阶实现 Serializable 支持分布式增加字段校验、类型安全批量赋值、批量状态重置字段级回滚基于 oldDataMap状态变更监听器 / 日志埋点与 Spring/JDBC/MyBatis 集成结语这套 Row 状态机是设计模式落地的典型案例不盲目套用教科书而是根据场景做极简工程化实现既保证模式思想又保证性能、可维护性与落地效率。