
示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载Service to Worker服务到工作者是一种架构型设计模式它将 Web 应用中的请求处理、控制流与视图管理分离为职责清晰的组件本质上是 Dispatcher View 与 Service Locator 思想的结合。本文以 java-design-patterns 仓库中的 service-to-worker 模块为骨架完整解析该模式在 Java 应用中的落地方式、全部核心类的源码实现、测试验证方法以及适用场景帮助读者掌握一套可维护、可扩展的 Web 表现层分层方案。模式意图处理逻辑与视图的分离在典型的 Web 应用中请求往往需要经过参数校验、业务处理、结果组装等多道工序才能最终渲染到页面。如果这些逻辑全部堆在页面或控制器里会导致代码耦合、难以测试、多人协作互相踩踏。Service to Worker 模式的意图正是将处理processing、控制流control flow与视图管理view management解耦。它通过组合 Dispatcher View 与 Service Locator 两个既有模式让控制器只负责接收命令、Dispatcher 负责调度动作并选择视图、WorkerAction负责更新模型、View 负责渲染展示从而提升代码的可维护性与可扩展性。用一句话概括将 Web 应用中的处理逻辑与视图分离以提升可维护性和可扩展性该表述亦见于 service-to-worker/README.md 的 plain words 小节。现实世界类比餐厅中央厨房想象一家拥有中央厨房和多名服务员的连锁餐厅。顾客下单后服务员Controller接过订单交给厨房Service厨房处理订单、烹饪菜肴再交回给服务员服务员最终把菜端给顾客View。这个场景精确映射了 Java Web 应用中的 Service to Worker 结构后端逻辑厨房与前端交互服务员相互隔离各自专注本职。模式实现中GiantController扮演服务员控制器ActionWorker与Dispatcher扮演厨房调度GiantView扮演端菜上桌的最终展示层。模式参与者与整体结构从 类图PlantUML 源文件见 service-to-worker.urm.puml可以看出模块的核心参与者共 7 个类参与者角色核心职责GiantControllerController拦截请求、接收命令、触发视图刷新DispatcherDispatcher维护 Worker 列表执行动作并选择视图ActionWorker处理用户输入将其转化为对模型的更新GiantModelModel持有领域数据health/fatigue/nourishmentGiantViewView将模型数据渲染为面向用户的形式Command请求封装以 record 形式封装一次状态变更指令App入口组装各组件并驱动整个流程其协作关系时序图为Controller → Dispatcher → Action → GiantModel → GiantView形成一条单向、清晰的控制链。App类的源码注释也完整描述了这一流程前端控制器拦截所有请求并执行公共功能它把请求信息交给 DispatcherDispatcher 依据请求与内部模型选择并执行合适的 ActionAction 处理用户输入将其翻译为对模型的适当更新模型应用业务规则并持久化数据最后 Dispatcher 根据用户输入与动作结果选择视图视图把更新后的模型数据转换成用户可读的形式。详见 App.java。程序化示例完整源码逐类解析1. GiantController面向请求的入口GiantController是模式中的控制器对外只暴露两个能力setCommand下发命令、updateView刷新视图。它内部持有 Dispatcher所有请求都转交给 Dispatcher 处理public class GiantController { public Dispatcher dispatcher; public GiantController(Dispatcher dispatcher) { this.dispatcher dispatcher; } public void setCommand(Command s, int index) { dispatcher.performAction(s, index); } public void updateView(GiantModel giantModel) { dispatcher.updateView(giantModel); } }源码注释GiantController.java指出它是一个“拦截所有请求并执行公共功能的单例式对象”。注意updateView是简化实现注释明确说明真实场景中 View 可以采用更具体的实现如 JSP/模板渲染。2. Command不可变命令封装Java 16 的 record 让命令封装变得极其简洁。Command把一次状态变更所需的三个字段打包为不可变值对象public record Command(Fatigue fatigue, Health health, Nourishment nourishment) {}见 Command.java。其中Fatigue、Health、Nourishment三个枚举复用自仓库的 model-view-controller 模块该依赖声明于 service-to-worker/pom.xml取值分别为FatigueALERT警觉、SLEEPING睡眠、TIRED疲惫HealthDEAD死亡、HEALTHY健康、WOUNDED受伤NourishmentHUNGRY饥饿、SATURATED饱食、STARVING挨饿3. ActionWorker把命令翻译为模型更新Action是模式中的 Worker负责把用户输入Command翻译为对GiantModel的具体更新。每个 Action 绑定一个 GiantModelpublic class Action { public GiantModel giant; public Action(GiantModel giant) { this.giant giant; } public void updateModel(Command command) { setFatigue(command.fatigue()); setHealth(command.health()); setNourishment(command.nourishment()); } public void setHealth(Health health) { giant.setHealth(health); } public void setFatigue(Fatigue fatigue) { giant.setFatigue(fatigue); } public void setNourishment(Nourishment nourishment) { giant.setNourishment(nourishment); } }源码注释Action.java将其定义为可以处理用户输入并对模型执行特定更新的 Worker。4. Dispatcher调度中枢Dispatcher是模式的核心调度器封装了 Worker 选择与视图选择两大职责public class Dispatcher { Getter private final GiantView giantView; private final ListAction actions; public Dispatcher(GiantView giantView) { this.giantView giantView; this.actions new ArrayList(); } void addAction(Action action) { actions.add(action); } public void performAction(Command s, int actionIndex) { actions.get(actionIndex).updateModel(s); } public void updateView(GiantModel giantModel) { giantView.displayGiant(giantModel); } }关键点Dispatcher.java内部维护ListAction作为 Worker 注册表addAction负责注册包级私有performAction(Command, index)按下标定位 Worker 并执行命令——这就是依据请求信息选择 Worker的简化实现updateView把模型交给GiantView.displayGiant即选择并渲染视图。源码注释将 Dispatcher 定义为基于请求信息和/或内部导航模型封装 Worker 与视图选择的组件这正是 Service to Worker 中 Dispatcher View 角色的体现。5. GiantModel可复用的领域模型GiantModel对外包装了来自 model-view-controller 模块的领域模型添加了name属性并提供对 health/fatigue/nourishment 三态的读写方法以及格式化输出GiantModel(String name, Health health, Fatigue fatigue, Nourishment nourishment) { this.name name; this.model new com.iluwatar.model.view.controller.GiantModel(health, fatigue, nourishment); } Override public String toString() { return String.format( Giant %s, The giant looks %s, %s and %s., name, model.getHealth(), model.getFatigue(), model.getNourishment()); }见 GiantModel.java。6. GiantView极简渲染层GiantView借助 Lombok 的Slf4j注解生成日志器把模型渲染为日志输出——在真实 Web 工程中这一层通常对应 JSP、Thymeleaf 模板等视图技术Slf4j public class GiantView { public void displayGiant(GiantModel giant) { LOGGER.info(giant.toString()); } }见 GiantView.java。入口程序与运行输出App.main完整演示了组件的组装与两轮显示 → 下发命令 → 再显示的交互流程public class App { public static void main(String[] args) { var giant1 new GiantModel(giant1, Health.HEALTHY, Fatigue.ALERT, Nourishment.SATURATED); var giant2 new GiantModel(giant2, Health.DEAD, Fatigue.SLEEPING, Nourishment.STARVING); var action1 new Action(giant1); var action2 new Action(giant2); var view new GiantView(); var dispatcher new Dispatcher(view); dispatcher.addAction(action1); dispatcher.addAction(action2); var controller new GiantController(dispatcher); controller.updateView(giant1); controller.updateView(giant2); controller.setCommand(new Command(Fatigue.SLEEPING, Health.HEALTHY, Nourishment.STARVING), 0); controller.setCommand(new Command(Fatigue.ALERT, Health.HEALTHY, Nourishment.HUNGRY), 1); controller.updateView(giant1); controller.updateView(giant2); } }完整源码见 App.java。运行该程序的对应控制台输出12:23:10.895 [main] INFO com.iluwatar.servicetoworker.GiantView -- Giant giant1, The giant looks healthy, alert and saturated. 12:23:10.897 [main] INFO com.iluwatar.servicetoworker.GiantView -- Giant giant1, The giant looks healthy, sleeping and starving. 12:23:10.897 [main] INFO com.iluwatar.servicetoworker.GiantView -- Giant giant2, The giant looks dead, sleeping and starving. 12:23:10.897 [main] INFO com.iluwatar.servicetoworker.GiantView -- Giant giant2, The giant looks healthy, alert and hungry.可以看到命令 0 把giant1的疲劳改为SLEEPING、饱食度改为STARVING命令 1 把giant2的疲劳改为ALERT、饱食度改为HUNGRY——控制器只下发命令模型状态变更与视图刷新全部由 Dispatcher/Action/View 协作完成。测试验证核心行为的自动化保障模块在 service-to-worker/src/test 下提供了 6 个测试类覆盖了模式的每条关键链路DispatcherTesttestPerformAction遍历Nourishment、Fatigue、Health三组枚举的全部 27 种组合构造 Command 并执行逐一断言模型三态被正确更新DispatcherTest.javatestUpdateView验证视图刷新不抛异常。GiantControllerTest验证setCommand确实通过 Dispatcher 将命令传播到模型GiantControllerTest.java并验证updateView链路畅通。另有ActionTest、GiantModelTest、GiantViewTest、AppTest分别覆盖 Worker 更新逻辑、模型读写与格式化、视图日志输出以及入口程序的冒烟执行。这些测试表明即便替换 View 实现或新增 Command 类型只要 Dispatcher 的调度契约不变控制器层与展示层都可以独立演进。如何运行与查看service-to-worker 是 Maven 多模块工程的一个子模块groupId: com.iluwatar版本继承自根 pom 的1.26.0-SNAPSHOT其 pom.xml 通过 maven-assembly-plugin 将com.iluwatar.servicetoworker.App配置为可执行主类。在仓库根目录执行./mvnw -pl service-to-worker compile exec:java -Dexec.mainClasscom.iluwatar.servicetoworker.App即可看到上述控制台输出。也可直接运行根目录的 mvnw 包装脚本进入模块目录执行./mvnw test验证全部测试用例。何时使用 Service to Worker 模式根据 service-to-worker/README.md适合采用该模式的情形包括需要将控制器逻辑与视图分离以提升可维护性并让团队成员能独立开发应用的不同部分适用于采用 MVC 架构的 Java Web 应用适用于需要在展示视图之前进行复杂请求处理的场景。典型误用信号应用只有简单的请求 → 页面直通逻辑没有复杂的业务处理与多视图选择此时引入该模式反而徒增分层复杂度。真实世界应用该模式在业界有成熟落地Struts与Spring MVC等基于 Java 的 Web 框架其 DispatcherServlet / ActionServlet 本质上就是模式中的 Dispatcher负责把请求路由到对应的 Controller/Handler再选择视图解析器渲染企业级 Web 应用需要表现层逻辑与业务逻辑清晰隔离的场合。以上来自 service-to-worker/README.md 的 Real-World Applications 小节。收益与权衡收益通过关注点分离separation of concerns提升代码可维护性解耦控制器与视图组件促进团队协作——前后端/表现层与逻辑层可并行开发新增视图、修改既有视图更加简单改动影响面被限制在视图层。权衡增加了应用结构的复杂度——需要理解并维护 Controller、Dispatcher、Action、View 之间的协作关系分层架构可能引入额外开销对于简单应用而言可能过度设计。与其他模式的关系Model-View-ControllerService to Worker 是 MVC 的一种特化形态聚焦于把请求处理与视图管理进一步拆开本模块的GiantModel、GiantView即直接复用自该模块。Front Controller常与 Service to Worker 搭配使用前者负责集中化请求处理与路由GiantController即扮演了类似的前端控制器角色后者负责调度 Worker 与选择视图。小结Service to Worker 用一个清晰的三段式链路——Controller 收命令、Dispatcher 调度 Worker、View 渲染模型——把 Web 表现层的复杂度拆解为可独立演进、可单独测试的组件。java-design-patterns 仓库的 service-to-worker 模块以不足十个类完整呈现了这一模式配合 时序图 与 类图 以及覆盖全部链路的单元测试是一份可直接对照学习、甚至可以扩展到真实 Web 框架实践的最小可运行范本。赞分享示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载相关推荐终极虚幻引擎存档编辑器5分钟快速上手uesave-rs完整指南终极虚幻引擎存档编辑器5分钟快速上手uesave rs完整指南 你是否曾因游戏存档损坏而痛失数十小时进度面对虚幻引擎生成的二进制.sav文件传统文本编辑器序列化游戏开发开发工具Java 设计模式之 Service Stub服务桩模式以情感分析服务为例实现隔离测试Java 设计模式之 Service Stub服务桩模式以情感分析服务为例实现隔离测试 Service Stub服务桩又称 Service Mock示例工程教程Java 设计模式实战Balking 模式在 java-design-patterns 中的实现与并发应用Java 设计模式实战Balking 模式在 java design patterns 中的实现与并发应用 Balking退缩/迟疑模式是 Java 并发示例工程教程上一篇GalaxyBudsClient脚本系统解析实验性功能与钩子机制下一篇Termwind入门指南10分钟打造你的第一个PHP命令行美化应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考