Jive 中的设计模式 (Design Pattern)

一文搞定 GitHub SSH Key:生成、配置、好处全攻略 本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 关键字: Jive, Design Pattern. 时间: 2001-4-1 摘要: Jive 是一个开放源码的论坛项目, 也就是我们所常见的 BBS, 采用了 SUN 公司的 JSP 技术, 相比起 j2ee 这个庞大的体系结构, 其整个的设计思想非常 精炼, 适用于中小型网站, 建立自己的论坛系统. 这篇文章我们就一起来看一看 Jive 中所应用的设计模式(Design Pattern). 正文: 关于设计模式, 这篇文章并不详细解释, 只是结合 Jive 来看看设计模式在一 个实际项目中的应用及其整体的设计思想. 所以在读这篇文章前, 假设您对设计模 式有一个感性的认识, 对其具体应用以及实现方法有些疑问, 并渴望了解其思想, 并使用过 Jive. 本文将一同来探讨这个问题. 为什么选择 Jive 而不是选择一个新的 例子重新开始呢? 有以下两个原因: 1, 我们很多人对 bbs 这样一个事物比较熟悉, 很清楚 bbs 所具有的一些基本功能, 如果自己作为设计者来设计这样一个 web bbs, 会怎么想, 再看看别人是怎么实现的, 有对比才能明白自己设计上的缺点, 看到别人 的优点才能更快地进步. 2, Jive 并不是非常地复杂, 并且包括了一个完整的实现方 案, 从底层到高层, 从后端到前端, 都有很好的文档, 这些都能更好地帮助我们理解 它. 这里我们所用的 Jive 的版本采用其开发者作为正式发布的 1.0 版, 其最新版 为 1.21, 对其结构作了少量改动, 主要增加了 jsp tag 的支持, 这种技术不属于我 们的讨论范围, 以后有机会可以共同学习. Jive 中所使用的设计模式, 对设计模式的三种类型 -- 创建型, 结构型, 行为型 -- 都有涉及, 这样也能比较全面地了解设计模式. 我们先来自己设计一下, 运用面向对象的思想, 可以很容易知道, 整个系统主要需要这几个对象: 1, Forum -- 一个讨论区, 也就是一个版面. 2, Thread -- 一条线索, 也就是有关同一个主题的所有的回文. 3, Message -- 一条消息, 也就是一个用户发的一篇贴子. (以后我们就用"贴子"这个叫法) 4, User -- 一个用户, 也就是讨论区的使用者. 好了, 我们需要的东西都在了, 它们之间的关系十分复杂, 怎么把它们组织地 很符合我们的思路又能容易扩充呢? 我想大家都有自己的想法了, "我能这么这么做", "我可以这样这样设计", 我们一起来看看 Jive 是怎么做的. 下面是其整体结构: |~~~~~~~~~~~~~~~~~~| | Skin 设计者 | |__________________| | | | | 使用 / / |~~~~~~~~~~~~~~~~~| | 各种对象的接口 | |_________________| | | | | 被实现 / / |~~~~~~~~~~~~| | 权限控制 | |____________| | | | | 控制 / / |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| | 对数据库进行操作的各种对象 | |_____________________________| | | | | 取连接 / / |~~~~~~~~~~~~~~~~| | 数据库连接池 | |________________| (图 1) 下面是其类的大概的继承情况: |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| | Interface A | |___________________________________| | | | implements | | | |~~~~~~~~~~~~~~~~~| | | Proxy A | | |_________________| | | | |~~~~~~~~~~~~~~~~~~| | Database A | |__________________| (图 2) 好了看到这里, 如果您对设计模式有了解的话, 从上面所写的伪名字中, 可以 看到一些熟悉的东西. 请让我做一些解释. 上面的图表示的是类的继承关系, A 代 表上面所提到的四种对象, Interface A 表示名为 A 的一个接口, 相信大家对接口 都不陌生, 接口在 java 中有着重要的作用. Proxy A 表示一个名为 ProxyA 的类, 实现 A 接口. Database A 表示名为 DbA 的一个类, 实现 A 接口. 但设计模式并 没有从中体现出来,设计模式所要表现的是怎么样更好地组织对象之间的逻辑关系, 怎么样才能更好地扩充现有的东西而不需要作很大的改动, 而不仅仅是类的继承. 还有一点需要说明的是, 设计模式总的原则是针对接口编程, 而不关心其具体 实现, 这样搭起来的是一个架子, 还需要作许多具体的编程才能真正的完成系统. 下面, 我们就分别从设计模式的三种类型来看 Jive 使用了其中的哪些. 一, 创建型模式 (Creational Patterns) 这一类型的设计模式, 所要表现的是对象的创建过程及和用户所使用的对象之间 的关系. 1, Jive 中在 Forum 之上又加了一层, ForumFactory, 来实现对 Forum 的一些控 制, 比如创建新的讨论区, 删除一个讨论区等等. 这个类实际上是整个系统的入口, jsp 中所做的一切都要从得到这个类的一个实例开始. 它的一些子类和它的关系如 下: |~~~~~~~~~~~~~~~~~| | ForumFactory | abstract |_________________| | | | extends | | | |~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~~~| | ForumFactoryProxy | | DbForumFactory | |____________________| |_________________| (图 3) 我们来看一下得到一个 ForumFactory 实例的过程: FactoryForum factory = ForumFactory.getInstance(aAuthorization); 就得到了 ForumFactory 的实例, 这个最终用户(skin 设计人员)所使用的是它的子 类 ForumFactoryProxy 的实例, (其中涉及到另一个模式, 后面将会提到), 但实际 上真正在做实际工作的是 DbForumFactory 或者是一个指定的类的实例, 相关代码如 下: From ForumFactory.java private static String className = "com.coolservlets.forum.database.DbForumFaactory"; // 系统缺省的 ForumFactory 的一个具体的子类. private static ForumFactory factory = null; ForumFactory.getInstance() String classNameProp = PropertyManager.getProperty("ForumFactory.className") // 可以通过配制文件来选择其他的具体的子类. if (classNameProp != null) { className = classNameProp; } try { //Load the class and create an instance. Class c = Class.forName(className); factory = (ForumFactory)c.newInstance(); } catch (Exception e) { System.err.println("Failed to load ForumFactory class " className ". Jive cannot function normally."); e.printStackTrace(); return null; } 它使用的是 Abstract Factory (抽象工厂)设计模式. 给用户一个使用一系列相关对象 的接口, 而不需要指定其具体的类. 也就是说, skin 设计人员写的 jsp 中不应该出现 new DbForumFactory 之类的语句. Jive 中 AuthorizationFactory 也使用了这个设计模式 2, Jive 中有一个很不错的想法, 就是对贴子的内容和标题可以进行过滤, 比如过滤 html 过滤一些脏话, 对附加的代码进行高亮显示, 转换链接等等. 如果我要实现这样的功能, 有有? 下几种方法: (1) 在 Message.getBody() getSubject() 中进行控制, (2) 在 Thread 中得得? Message 后进行转换. 还需要考虑的问题是这些过滤的操作必须能够很方便地添加删除. 不不? 的目标所用的设计方法是不一样的, Jive 是这样做的: 以版面为主, 把这些过滤器看作是鞍婷? 的属性, 过滤器只对其所属的版面有效, 所以 Jive 中使用了 (2), 这并不是主要的, 重要要? 是这些过滤器该怎么来组织. 我们先来看看需求: 能动态添加删除, 功能类似, 贴子的显示示? 其具体怎么创建, 如何表现无关. 似乎目标只有一个 -- Prototype(原型) 设计模式. 看看 Jive 的具体实现. |~~~~~~~~~~~~~~~~~~~~| | ForumMessage | |____________________| | | implements | |~~~~~~~~~~~~~~~~| Prototype |~~~~~~~~~~~~~~~~~~~~~| | ForumThread |--------- | ForumMessageFilter | |----------------| |---------------------| | getMessage() o | | clone() | |______________|_| |_____________________| | / | |~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~| | aFilter.clone()| | HighlightCode | | HTML | |________________| |---------------| |-------------| ...... | clone() o | | clone() o | |___________|___| |___________|_| | | |~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~| | 返回一个实例 | | 返回一个实例 | |_______________| |_______________| (图 4) 上图作了少许的简化. Jive 用的时候是把这些过滤器存在数据库中, 可以动态设置 属性, 比较方便. 来看一些代码: From: DbForumThread.java public ForumMessage getMessage(int messageID) throws ForumMessageNotFoundException { ForumMessage message = factory.getMessage(messageID); //Apply filters to message. message = forum.applyFilters(message); //通过 Forum 来实现, 因为 Filter 是 Forum 的属性, //Thread 只能通过 Forum 的接口来访问. return message; } From: DbForum.java public ForumMessage applyFilters(ForumMessage message) { for (int i=0; i < filters.length; i ) { message = filters[i].clone(message); } //可能会有多个过滤器, 依次来操作. return message; } 二, 结构型模式 (Structural Patterns) 这一类的模式关心类和对象之间怎么组织起来形成大的结构. 主要使用继承来 组织接口或实现. 1, 我们再接着思考一下, 用户之间应该有所区别, 有 Guest 用户, 可以让他来看一 看, 但不能发贴子, 正式用户可以发贴子, 查看自己的个人信息, 版面管理者(称之为 版主)应该可以控制贴子, 比如加上适当的标记, 收入精华区, 甚至删除贴子等等, 而 系统管理者应该具有更高的权限, 比如开新的版面, 删除用户等操作. 怎么实现这个 功能呢? 我们知道, Jive 中所有实际的操作都是由 database 目录下的类所实现的, 如果把权限控制加到数据库这一层的话, 这一层不但臃肿, 而且写好以后, 如果要改 的话, 需要修改的地方很多, 还容易出错, 所以可以在这一层之上再加一层, 单独进 行权限控制. 这样就把 "该不该做" 和 "怎么做" 分割开来, 利于以后修改. 其实这 也是面象对象的一个思想 -- 一个对象不要负担太多的责任. 这种方法在设计模式中 称为 Proxy (代理) 模式. 好比生产厂家和代理商的关系. (当然, 在 Jive 中这个比 喻不太合适). Proxy 的目的就是给另一个对象提供一个代理来控制对它的访问. Proxy 模式一直贯穿 Jive 的始终, 几乎所涉及到的对象都需要. 其结构如图 2 所示. 从前面已经知道, ForumFactory 是整个系统的开始. 再来看看 ForumFactory 的代码: From ForumFactory.java ForumFactory.getInstance() 的最后: ForumFactoryProxy proxy = new ForumFactoryProxy( factory, authorization, factory.getPermissions(authorization) ); return proxy; 前面得到的 factory 是 DbForumFactory 的实例, 这里把这个实例又用 ForumFactoryProxy 封装起来. 最后返回一个 ForumFactoryProxy 的实例. 也就是 说 jsp skin 的设计者所用的 ForumFactory 实际上是 ForumFactoryProxy. 接着看 看 ForumFactoryProxy 里发生了什么事, 那一个小片段做例子: 其构造函数中的 Factory 就是一个 DbForumFactory 的实例, 由它来做具体的 工作. Authorization 可以认为是一个认证过的当前用户(指实际的浏览器的使用者), ForumPermissions 可以认为是当前用户的权限. public Forum createForum(String name, String description) throws UnauthorizedException { //这里就对权限进行了检查, 具有系统管理员权限, 则可以进行相应的操作, //否则抛出异常. if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) { Forum newForum = factory.createForum(name, description); return new ForumProxy(newForum, authorization, permissions); } else { throw new UnauthorizedException(); } } public Forum getForum(int ID) throws ForumNotFoundException, UnauthorizedException { Forum forum = factory.getForum(ID); ForumPermissions forumPermissions = forum.getPermissions(authorization); //Create a new permissions object with the combination of the //permissions of this object and tempPermissions. ForumPermissions newPermissions = new ForumPermissions(permissions, forumPermissions); //Check and see if the user has READ permissions. If not, throw an //an UnauthorizedException. if (!( newPermissions.get(ForumPermissions.READ) || newPermissions.get(ForumPermissions.FORUM_ADMIN) || newPermissions.get(ForumPermissions.SYSTEM_ADMIN) )) { throw new UnauthorizedException(); } // 同上所述. // 这里得到的 forum, 是一个 DbForum 的实例, 跟 ForumFactory 一样, // 返回一个封装过的代理对象, 来对 forum 进行权限控制. return new ForumProxy(forum, authorization, newPermissions); } 其他所有的对象都是类似的. 这里就不再赘述. 三, 行为型模式 (Behavioral Patterns) 这一类的模式关心的是算法以及对象之间的任务分配. 它所描述的不仅仅是对象或类 的设计模式, 还有它们之间的通讯模式. 1, 下来看看怎么从一个 Forum 中得到一些 Thread. 当然这里要涉及到数据库, 我们 先设计一个最简单的数据库表, 表名: thread, 字段 ThreadID int, ForumID int, 其 他内容我们不关心. 然后比如 Forum 中的一个方法, getThreads() 来返回当前 Forum 所有的 Thread. 然后就可以这样做: public ForumThread[] getThreads() { 1, 从数据库里面查询, 取出所有的 ThreadID, 2, 根据 ThreadID 构造 ForumThread 对象, 3, 返回一个数组. } 这样做最省事, 最简单了, 但好不好呢? 还得看需求, 比如我要求根据时间排序, 就还得修改这个方法, 也就是说需要修改 DbForum 对象. 那为什么不把取 Thread 这个 操作单独拿出来呢? 这样的好处就是功能独立化, 使 DbForum 更简单, 符合前面我们所 提到的不要让对象负担太多的责任这个原则. 也许你会说, 如果要修改的话, 不是都得 修改吗? 放哪里是一样的, 这样没错, 但只限于很小的系统, 如果系统一大, 那么就可 能做 DbForum 中的简单查询和一些比较复杂的查询的程序员就不是一个人, 这样牵扯到 需要改动的地方较多, 但分离以后, 只需要一个人改很少的地方就可以完成. 回过头来 再看看问题, 这里要返回一群 ForumThread 对象, 而且它们之间还可能有一定的先后关 系, 怎么来做这个工作呢? Iterator 设计模式是一个合适的选择. Iterator 模式提供 了一个连续访问一大群对象的方法, 而不需要知道它们的表现形式, 比如按什么方式排 序等等. 好了, 来看看 Jive 的具体实现. 由于 Java 本身已经有这样的接口, Iterator 接 口, 所以只要实现这个接口就可以了. From DbForum: public Iterator threads() { return new DbForumIterator(this, factory); } From DbForumIterator: (做了改动) public class DbForumIterator implements Iterator { public DbForumIterator(...) { ... } public boolean hasNext() //是否还有元素 { ... } public Object next() // 得到下一个元素 { ... } ... } 那么 jsp 中可以这样访问: Iterator threads = aForum.threads(); while (threads.hasNext()) { ForumThread thread = (ForumThread)threads.next(); 做一些操作. } 从中可以看出, 通过使用 Iterator 把 Threads 的一些具体细节进行了封 装, 提供统一的接口. Jive 中这个设计模式也是用的非常多, 多个用户显示, 多个版面显示, 多个线索, 多个贴子都需要由它来实现. 小结: 上面我们一起探讨了一下设计模式在 Jive 中的应用情况, 当然只是很简单, 很 肤浅, 也很片面, 不过总算能对设计模式有些认识. 实际上, 设计模式就是吸收许多前 人的经验, 把设计中一些重要的和重复出现的一些模式总结起来, 给出一个系统的命名, 给出相应的解释和评价, 这个工作最先由 4 位软件大师所做, 他们合写了一本书 -- Design Pattern: Elements of Reusable Object-Oriented Software, 后来, 人们把 他们称为 GoF (Gang Of Four). 对于设计模式, 可能在我们的实际项目中自觉不自觉地在使用着, 比如 Factory Method 模式, Abstract 模式, Singleton 模式, Iterator 模式, 等等, 只是概念不是非? 的明确, 设计可能还有不太合理的地方, 处于一种跟着感觉走的状态, 相信很多有经验 的设计者, 原来没有接触设计模式, 一旦接触以后, 会有一种恍然大悟的想法, 哈, 原 来是这么回事. 学习设计模式, 能很好地帮助我们设计, 在相同的问题, 相同的背景下, 可以直接使用它, 有的时候不知道该选择哪种好, 就需对问题进行更深一层的分析, 进行 综合权衡, 对设计模式也要进行更深刻的理解, 才能得到好的结果, 这也是一个进步的 过程. 对于笔者来说, 刚刚接触设计模式, 有了一点粗浅的理解, 就冒昧写了这篇算是一 点心得的东西, 也是对自己的挑战, 中间犯的一些错误, 还请指正, 谢谢. 参考文献: 1, Design Pattern: Elements of Reusable Object-Oriented Software, 2, Jive 源代码
项目经理必看:如何建立高效的相关方沟通机制? 你是否遇到过这样的场景?客户突然说“这不是我要的”,开发团队抱怨“需求总变”,高层追问“进度滞后为什么不早说”?这些问题的根源往往是——相关方沟通机制失效。本文聚焦“如何建立高效沟通机制”,覆盖从识别相关方到持续优化的全流程,适用于IT、产品、工程等各类项目。本文将按“理解问题→拆解核心概念→掌握工具方法→实战落地→未来趋势”的逻辑展开,重点讲解“相关方分析矩阵”“沟通计划表”等实用工具,并用“组织生日派对”的案例贯穿全文,让抽象概念变得可感知。相关方识别:用“权力/利益矩阵”找对人(像派对邀请关键客人) 阅读详情

相关推荐

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析

本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。

5f4d3s2a1q的博客 1061

Java的九阴真经

http://www.jdon.com/index.html 如果你是一个java web 方面的程序员,请你一定药看看这个: Jive是一个开放的Java源代码项目。其目标是建设一个开放结构的,强壮的,易于扩展的基于JSP的论坛。在其设计目标的指导下,其结构设计得非常得 好,融合了很多新的观念,比如Design Pattern,可更换的Skin,可插入Plug等等。详细解读其源代码...

Chinaxxren 320

解决Anaconda环境下catkin_make编译报错:Python路径冲突与empy模块缺失

本文详细分析了在Anaconda环境下使用catkin_make编译时出现的Python路径冲突与empy模块缺失问题,提供了快速解决方案和永久性环境配置方法。通过显式指定Python解释器路径或调整Anaconda配置,有效解决编译报错问题,适用于ROS开发与科学计算并行的场景。

weixin_28829629的博客 354

Java Design Pattern

一、Factory 工厂模式 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的。 工厂模式的好处:工厂模式可以做到把创建对象...

weixin_30764137的博客 134

保姆级教程:用LoRA微调Chinese-Mistral-7B模型,并一键部署到Ollama(附完整代码)

本文提供了一份详细的LoRA微调Chinese-Mistral-7B模型的保姆级教程,涵盖环境配置、数据预处理、微调实战、模型量化及Ollama部署全流程。通过实战案例和完整代码,帮助开发者快速构建专属中文大模型,适用于医疗、法律等垂直领域。

weixin_30369041的博客 251

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入探讨了SAP CO模块中KKA2和CJ88结果分析码在项目收入成本匹配中的高阶应用。通过真实案例解析,详细介绍了这两种分析码在分阶段收入确认和终验法项目中的配置技巧与实战经验,帮助财务人员高效解决复杂业务场景下的财务数据处理难题。

weixin_29230773的博客 170

Design Pattern: Decorator 模式

装饰模式:Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油 漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功 能的扩充显得更为灵活. 为什么使用Decora...

Chinaxxren 217

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 339

SpringBoot4.0+JDK25+GraalVM实战:云原生新纪元,微服务性能翻倍的落地指南

三者的组合不是偶然,而是“框架优化+JDK升级+虚拟机革新”的必然结果——SpringBoot4.0完善了对GraalVM原生镜像的支持,JDK25强化了云原生与AOT编译能力,GraalVM则提供了极致的启动速度和资源利用率,三者协同,刚好命中云原生微服务的核心痛点。SpringBoot4.0+JDK25+GraalVM的组合,不是简单的版本升级,而是云原生微服务的一次性能革命。

2601_94871597的博客 1142

[SV]SystemVerilog状态机实现案例

本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。

元直的博客 2022

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 27

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 232

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 310

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 120

设计模式之策略模式

策略模式是一种行为型设计模式,将可互换的算法封装为独立策略,使客户端可在运行时动态选择并切换算法。核心由策略接口、具体策略和上下文三部分组成。通过将算法与使用分离,实现解耦与灵活扩展。适用于多算法场景,如支付方式、排序策略等,避免冗长的if/else。

FallingGod的博客 417

设计模式指南 (Java 版)

设计模式是解决软件设计中常见问题的可复用方案,而非直接代码。本文以最简方式梳理三大类设计模式:创建型(如单例、工厂方法)、结构型(如适配器、装饰器)和行为型(如观察者、策略)。通过生活化类比与Java示例,强调“按需使用、避免过度设计”的原则,帮助理解其核心思想与实际应用。

sync_with_U 253

Vue3 组合式函数(Composables)设计模式:从封装到复用

本文以一次因复制粘贴导致的全局状态污染事故为引,深入剖析 Vue 3 Composable 的三大陷阱:单例状态误用、生命周期钩子注册失效与异步请求竞态。作者通过重构实践,强调 Composable 复用的核心是“带生命周期的响应式上下文”,而非简单代码复用。提出关键规范:状态归属决定 ref 位置、钩子必须在 setup 同步执行、用序号或 AbortController 解决竞态,并倡导基于“状态与生命周期”判断抽取时机,最终提升代码健壮性与团队协作效率。

滴水成河,汇流成海 172

【第四部分:Agentic 智能体设计模式】18.Agent 并行化实战:任务拆分、并发执行与结果汇总

本文介绍 Parallelization(并行化模式)的原理与工程实现,重点分析 Fan-out / Fan-in、Sectioning、Voting、任务依赖、上下文隔离、并发控制及部分失败处理。结合采购合同并行分析案例与 Java CompletableFuture 代码,说明如何实现独立任务的并发执行、结构化结果汇总和证据校验。同时介绍 LangGraph 动态任务分发、OpenAI 并行 Subagent、LangChain 异步 Subagent 及 DeepSeek Super-agent 等近

weixin_42258782的博客 254

设计模式之访问者模式

访问者模式是一种行为型设计模式,核心思想是将操作从元素类中分离,通过“访问者”统一管理对对象结构的多种操作。适用于元素类型稳定但操作频繁变化的场景。其精髓在于双重分派:元素通过accept方法触发访问者visit,最终由元素和访问者的运行时类型共同决定具体执行逻辑。该模式避免了在元素类中添加大量方法,提升扩展性,但会增加类数量与复杂度。典型应用如编译器语法树遍历、报表统计等。

FallingGod的博客 130

设计模式与生活⑭:一栋楼,共用一份热

今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。

工一木子 372

设计模式之模板方法模式

模板方法模式通过定义算法骨架,将可变步骤延迟至子类实现,实现流程复用。核心是父类的final模板方法锁定执行顺序,子类仅需实现抽象方法或覆盖钩子。如冲泡饮品场景中,烧水、倒杯等固定步骤由父类完成,冲泡与加调料由子类定制。该模式避免代码重复,提升扩展性,适用于流程固定但部分步骤可变的场景。

FallingGod的博客 325

LangGraph 体系实战(下):中断恢复、流式、子图与设计模式

LangGraph的动态中断机制允许用户在图执行过程中设置暂停点,等待外部输入后再继续执行,提供了人机交互接口。当中断触发时,LangGraph会通过持久化机制保存当前图状态,并无限期等待直到用户恢复执行。中断通过在任意图节点中调用 interrupt()函数实现,该函数可以接收任何可 JSON序列化的值,并将该值暴露给调用方。中断触发后,调用方根据 interrupt()暴露的信息生成反馈,重新调用图时通过 Command将反馈传递给计算图,恢复图的运行。

不吃紫菜的博客 228

设计模式 - 访问者模式

概述 访问者模式(Visitor Pattern)是一种行为型设计模式,它通过为对象结构中的每个元素添加一个访问操作,使得可以在不改变元素类的前提下定义作用于这些元素的新操作。

2601_96797912的博客 196

设计模式指南 (Java 版) ㊁

本文以简洁易懂的方式介绍Java中的设计模式,按创建型、结构型、行为型分类,重点解析简单工厂与工厂方法模式。通过现实案例(如造门、招聘)类比,阐明其核心思想:封装对象创建逻辑,提升代码可维护性。强调设计模式是解决问题的指导原则,而非万能药,应避免过度设计,合理使用方能发挥最大价值。

sync_with_U 172

Day37 · 设计模式

设计模式(Design Pattern)是前人总结的、针对软件设计中反复出现问题的经典解决方案模板。它不是可以直接抄来运行的代码,而是一套"思路 + 结构"。创建型(Creational):对象怎么创建——单例、工厂方法、抽象工厂、建造者、原型;结构型(Structural):类和对象怎么组合成更大的结构——适配器、装饰器、代理、外观、桥接、组合、享元;行为型(Behavioral):对象之间怎么分工通信——策略、模板方法、观察者、迭代器、责任链、命令、状态、备忘录、访问者、中介者、解释器等。

小嘉丶学长的博客 165
上一篇: Stryon产品方案介绍
下一篇: scjp1.4将于八月十九开始上马
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值