Property 模式实战解析:基于原型继承的动态属性管理(java-design-patterns 源码级解读)
发布时间:2026/10/1 23:48:56来源:尧图网络
示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载导读本文以 java-design-patterns 仓库中 localization/es/property/README.mdProperty 模式的西班牙语文档为核心骨架结合仓库内 property 模块的完整源码与单元测试系统讲解 Property 模式的意图、原型继承的实现原理、可运行的代码示例、适用场景与权衡取舍。读完本文你将掌握如何在不改动类结构的前提下通过原型链动态地为对象添加、移除和覆盖属性并能在游戏角色、配置系统、用户画像等场景中直接落地该模式。一、模式意图PropósitoProperty 模式的核心目标是利用已有对象作为父对象原型创建新的对象并构成对象层级。它允许为一个对象定义和管理一组动态属性在运行时灵活地增加、删除或修改属性而无需重新定义核心类的结构。用一句话概括与文档 En palabras simples 对应定义并管理对象的一组动态属性在不改变其结构的前提下实现个性化定制。二、现实世界类比文档给出了两个贴近生活的例子奇幻大陆 Elandria冒险者通过收集古代遗物Reliquias来定制自己的技能。每件遗物代表一项独一无二的属性或能力随着冒险者探索、发现并融合新遗物他们的能力会基于所拥有的遗物动态增强。智能手机定制软件设计师可以从处理器型号、摄像头规格、电池容量等组件中自由选择每个组件都是智能手机的一项属性。当技术演进、新组件出现时设计师可以无缝地添加或替换属性拼出独一无二的配置而无需重写核心设计结构。这两个例子共同揭示出 Property 模式的本质把对象拥有什么从类的静态定义中解放出来交给运行时动态决定。三、可运行的程序化示例文档提供了基于游戏角色的完整示例。在仓库中该示例的完整实现位于 property/src/main/java/com/iluwatar/property共四个核心文件文件作用Stats.java定义角色可拥有的全部属性枚举Character.java核心角色类实现 Prototype 接口Prototype.java原型继承的统一操作接口App.java演示入口 main 方法3.1 属性与角色类型枚举Stats.java 定义了角色可能拥有的全部属性Character.java 内部则嵌套定义了角色类型枚举// 角色可拥有的属性敏捷、力量、攻击力、护甲、智力、精神、能量、怒气 public enum Stats { AGILITY, STRENGTH, ATTACK_POWER, ARMOR, INTELLECT, SPIRIT, ENERGY, RAGE } // Character 类内部嵌套的角色类型 public enum Type { WARRIOR, MAGE, ROGUE }3.2 Prototype 接口属性操作的统一契约Prototype.java 声明了四个核心方法构成原型继承的操作契约public interface Prototype { Integer get(Stats stat); // 获取指定属性值可能从原型链上继承而来 boolean has(Stats stat); // 判断是否拥有该属性 void set(Stats stat, Integer val); // 设置/覆盖属性 void remove(Stats stat); // 移除属性 }3.3 Character 实现委托式原型链Character.java 是模式的落地实现其关键设计在于用委托delegation构成原型链每个Character持有一个Prototype prototype引用父原型和一个本地的MapStats, Integer properties存储get方法采用本地优先、向上委托策略本地 Map 命中则直接返回否则递归委托给父原型prototype.get(stat)Override public Integer get(Stats stat) { var containsValue properties.containsKey(stat); if (containsValue) { return properties.get(stat); } else { return prototype.get(stat); // 沿原型链向上查找 } } Override public boolean has(Stats stat) { return get(stat) ! null; // 只要链上某处有值即视为拥有 } Override public void set(Stats stat, Integer val) { properties.put(stat, val); // 本地覆盖不影响父原型 } Override public void remove(Stats stat) { properties.put(stat, null); // 置空以屏蔽原型链上的继承值 }三个构造方法分别对应三种创建场景Character()创建根原型其父原型是一个空值对象Null-value object——匿名实现Prototypeget返回null、has返回false、set/remove空操作作为原型链的终止端点见 Character.javaCharacter(Type type, Prototype prototype)基于已有原型创建新原型只设置类型并持有父原型引用Character(String name, Character prototype)基于原型创建具名角色同时继承原型的type并挂接原型链。3.4 App 演示三层原型链构建App.java 完整展示了基础原型 → 职业原型 → 具体角色的三层结构// 第一层通用基础原型设置全角色共有的默认属性 var charProto new Character(); charProto.set(Stats.STRENGTH, 10); charProto.set(Stats.AGILITY, 10); charProto.set(Stats.ARMOR, 10); charProto.set(Stats.ATTACK_POWER, 10); // 第二层基于基础原型派生职业原型并添加职业专属属性 var mageProto new Character(Type.MAGE, charProto); mageProto.set(Stats.INTELLECT, 15); mageProto.set(Stats.SPIRIT, 10); var warProto new Character(Type.WARRIOR, charProto); warProto.set(Stats.RAGE, 15); warProto.set(Stats.ARMOR, 15); // 覆盖默认护甲 var rogueProto new Character(Type.ROGUE, charProto); rogueProto.set(Stats.ENERGY, 15); rogueProto.set(Stats.AGILITY, 15); // 覆盖默认敏捷 // 第三层基于职业原型创建具体玩家角色可再局部微调 var mag new Character(Player_1, mageProto); mag.set(Stats.ARMOR, 8); // 玩家级覆盖 var warrior new Character(Player_2, warProto); var rogue new Character(Player_3, rogueProto); var rogueDouble new Character(Player_4, rogue); rogueDouble.set(Stats.ATTACK_POWER, 12); // 继承自 rogue 再微调运行App.main后日志输出由 Lombok 的Slf4j提供控制台输出如下文档记录的真实运行结果Player: Player_1 Character type: MAGE Stats: - AGILITY:10 - STRENGTH:10 - ATTACK_POWER:10 - ARMOR:8 - INTELLECT:15 - SPIRIT:10 Player: Player_2 Character type: WARRIOR Stats: - AGILITY:10 - STRENGTH:10 - ATTACK_POWER:10 - ARMOR:15 - RAGE:15 Player: Player_3 Character type: ROGUE Stats: - AGILITY:15 - STRENGTH:10 - ATTACK_POWER:10 - ARMOR:10 - ENERGY:15 Player: Player_4 Character type: ROGUE Stats: - AGILITY:15 - STRENGTH:10 - ATTACK_POWER:12 - ARMOR:10 - ENERGY:15注意Player_4的示范意义它直接以roguePlayer_3 的原型为父原型创建仅覆盖ATTACK_POWER其余属性含AGILITY:15、ENERGY:15全部沿原型链继承而来——这正是对象继承对象的典型体现。格式化输出由 Character.java 的toString()完成遍历全部Stats对链上解析为null的属性跳过从而只展示有效属性。四、类图与运行时序4.1 类图文档给出了 Property 模式的 UML 类图完整刻画了Prototype接口、Character实现类以及Stats/Type枚举之间的关联关系4.2 时序图结合仓库英文版 property/README.md 中的时序图可以直观看到原型继承的运行流程客户端基于原型创建新角色 → 原型把基础属性复制给新角色 → 客户端为新角色设置专属属性 → 新角色将自定义属性写入本地存储并覆盖继承值五、测试用例佐证仓库为 Property 模式提供了两组单元测试验证了模式的行为契约CharacterTest.java验证原型链的完整行为。testPrototypeStats逐一验证每个属性在set后has为真、get返回期望值remove后恢复为false/nulltestCharacterStats验证基于原型创建的子角色能正确继承全部属性testToString与testName/testType则验证了格式化输出、具名角色与类型继承的边界行为。AppTest.java直接调用App.main断言整个演示流程不抛异常。这些测试从侧面印证了文档中get/has/set/remove四方法的语义约定可作为实现正确性的判据。六、适用场景Aplicabilidad根据文档与源码结构当出现以下需求时适合采用 Property 模式需要对象拥有动态的字段集合对象具备哪些属性在运行时才确定无法用固定类字段穷举需要原型式继承希望以对象继承对象的方式构造层级而非类继承新对象是已有对象的轻量变体需要运行时动态增删属性属性集随运行状态、用户选择或配置变化而改变同类实例需要不同的属性组合例如不同职业、不同玩家的角色属性差异巨大但共用同一角色类。典型落地领域包括游戏开发中的实体属性管理角色、道具、需要不同参数集的应用配置系统、允许动态扩展字段的用户画像/资料管理。七、现实世界的参照实现文档特别提到 JavaScript 的原型继承是 Property 模式在现实语言中的天然体现JavaScript 对象通过原型链prototype chain实现属性查找与继承任何对象都可以作为另一个对象的原型并可在运行时动态增删属性。Property 模式本质上就是把这种基于对象而非基于类的继承范式引入到 Java 这类静态类型语言中。八、优点与权衡优点灵活性Flexibility属性可在运行时动态添加、移除、修改适配多变需求解耦Decoupling对象的属性管理与其类定义解耦降低类与属性之间的依赖易用性Ease of Use在大系统中以统一接口集中管理属性简化了维护成本原型级复用父原型属性的增删会沿原型链即时传导给所有子对象一处修改、全局生效。权衡Trade-offs性能开销Performance Overhead动态属性管理依赖 Map 查找与原型链委托相比直接字段访问有额外运行时开销复杂度Complexity原型链的委托逻辑会增加代码理解与维护成本层级过深时排查困难类型安全Type Safety属性以MapStats, Integer形式的键值对存储丧失编译期类型检查取值可能为null需要调用方自行处理。九、与其他设计模式的关系Composite组合模式Composite 构建对象的树形层级Property 可视为其扁平化版本——不维护层级关系仅管理属性集合Decorator装饰器模式两者都增强对象能力但 Decorator 以包装方式动态添加职责Property 则直接动态添加属性Strategy策略模式Strategy 同样支持运行时行为变化但关注点是替换算法Property 关注点是增减属性数据。十、快速体验方式仓库采用 Maven 多模块结构Property 是独立子模块property/pom.xml。在仓库根目录执行以下命令即可运行演示程序与测试./mvnw -pl property compile exec:java # 运行 App 演示需按模块实际配置调整 ./mvnw -pl property test # 运行 CharacterTest 与 AppTest如果希望进一步研读可重点对照 App.java 的调用链、Character.java 的委托实现与 CharacterTest.java 的行为断言三者结合即可完整掌握该模式。赞分享示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载相关推荐Java 装饰器模式实战基于 java-design-patterns 的巨魔示例解读动态扩展与组合优于继承Java 装饰器模式实战基于 java design patterns 的巨魔示例解读动态扩展与组合优于继承 本文以 GitHub 精选项目 java des示例工程教程Java 动态代理模式实战基于 java-design-patterns 的 TinyRestClient 注解式 REST 客户端实现Java 动态代理模式实战基于 java design patterns 的 TinyRestClient 注解式 REST 客户端实现 动态代理Dynam示例工程教程Java 设计模式之 Subclass Sandbox子类沙箱基于 java-design-patterns 的源码级实战解析Java 设计模式之 Subclass Sandbox子类沙箱基于 java design patterns 的源码级实战解析 本文以 java desi示例工程教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网