Jive 中的设计模式 (Design Pattern)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
<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 源代码
C++设计模式面试通关手册 设计模式是C++面试的高频考点,几乎每场高级C++面试都会问到。但很多人只知道模式的名字,一旦面试官要求手写实现或讨论应用场景,就露馅了。这篇把面试最常考的6种设计模式从原理到实现全部讲透。模式用途关键点单例全局唯一实例私有构造 + 静态getInstance工厂创建对象封装创建逻辑观察者一对多依赖通知机制策略算法可替换组合优于继承装饰器动态添加功能继承的替代方案适配器接口转换兼容不同接口设计模式不是语法,是思想。 阅读详情

相关推荐

2026年最新新昌市公交线路及站点矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

Java的九阴真经

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

Chinaxxren 320

2026年最新开封市公交线路及站点矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

Java Design Pattern

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

weixin_30764137的博客 133

Design Pattern: Decorator 模式

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

Chinaxxren 216

设计模式精讲】30.总结 23 种设计模式(Summary of 23 Design Patterns)

先盘点 C++ 标准库与语言机制里已经落地的 12 种——迭代器是 STL 的地基、策略长在尖括号里、访问者化名 std::visit、智能指针正是 GoF 预言的智能引用代理——逐一给出 API、原理映射与用法要点;再看标准库没有的 11 种,到 Boost、POCO、AOSP 等知名开源项目里看真身:Binder 工厂、Iostreams 过滤流、NotificationCenter 中介者。最后用三张速查表收口:高频榜(哪些天天在用)、关联搭档表(哪些天然合作)、易混辨析表(哪些最常认错)。

码工许师傅 383

【AI编程系列】MCP 常用设计模式解读

Registry、Compose、BAM/Adapter、OpenAPI 和数据库是内部实现细节。它解决的是“工具契约、Agent 引导、路由和策略是否可审计、可发布、可回滚”。工具描述、资源内容、RAG 文档、Issue、README 和上游 API 返回的文本,都可能包含恶意指令。直接让 LLM 生成 SQL 的风险包括:字段口径错误、跨租户、任意 Join、资源失控、分页后误判 TopN。将“用户真正想完成的事”封装为一个业务工具,由服务端完成跨 API、数据投影、权限收敛和流程控制。

Yangy的博客 134

设计模式精讲】28.访问者模式(Visitor)

本文给出访问者的 GoF 意图:在不改元素类的前提下为结构加新操作,核心机关是双重分派——accept 调 visit,visit 重载选具体行为;C++98 版用 const 重载族贯穿只读访问,现代版给出 variant + std::visit 的无类形态与 overloaded 惯用法。文末对照 std::visit、Boost.Variant 的 static_visitor 与 POCO 的 SAX 处理器。这是 23 种模式的最后一难。

码工许师傅 160

设计模式精讲】26.策略模式(Strategy)

第一篇埋的伏笔到此兑现——反面教材一号 calcPrice 的 switch 又长回来了,二十七个分支,每加一种定价全函数回归。本文从「算法平行可换」与「状态依次迁移」的分野讲起,给出策略模式的 GoF 意图:定义算法族、各自封装、彼此可互换,让算法独立于使用它的客户变化;C++98 版把定价规则做成可注入的策略对象(自带费率与门槛数据),现代版给出 std::function 策略、模板策略(STL 比较器的形态)、以及把两个策略组合成链的高阶函数。C++ 的特殊地位值得一提:迭代器之后,策略是 STL

码工许师傅 419

设计模式精讲】24.观察者模式(Observer)

传感器每来一个新样本,当前值面板、统计面板、告警模块都该刷新——直觉的写法是在 onSample 里逐个调用三个面板,订阅者从此焊死在发布者体内,加一块面板改一次传感器。本文从 RG 的经典气象站讲起,给出观察者的 GoF 意图:一对多依赖、状态一变、全体自动通知——发布者对订阅者的认知降到「一个接口」为止;C++98 版覆盖 notify 的重入副本、推与拉两种模型,现代版给出 std::function 槽位、RAII 订阅令牌与 weak_ptr 三件套,把「观察者悬垂」这个 C++ 最著名的坑逐一封

码工许师傅 333

第四十二天学习心得

每次`DriverManager.getConnection()`都会创建新的物理连接,而**创建连接是非常耗时的操作**(TCP握手、身份验证等)。3. 连接池是性能优化的重要一环:从自己手写连接池到理解原理,再到后续学习Druid、HikariCP等成熟框架,这条学习路径让我明白——**框架不是凭空产生的,而是把简单原理做到极致**。**这两步必须同时成功或同时失败**——这就是事务的意义。核心思路:重写`Connection.close()`方法,让它不是真正关闭连接,而是**归还到连接池**。

z23456d的博客 170

设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)

行为型模式常被压缩成「一堆回调技巧」,十一种模式背起来像十一道独立考题。其实按「各自要解决的问题」聚类,四个问题就装下了:一组对象怎么对话(观察者/中介者/责任链)、变化的行为装进哪里(策略/模板方法/状态)、过去怎么留住(命令/备忘录)、结构怎么加工(迭代器/访问者/解释器)。同组是近亲,结构最像、最易混淆,本文逐组细说区别与联系,重点辨析「通信三兄弟」;跨组模式几乎不会认错,却常串成流水线。再以横向对比表、决策树、组合案例、常见误判与评审清单收口。读完你能对着一段交互代码说出:问题属于哪一组,组内该选谁

码工许师傅 273

NestJS 后端开发实战:从设计模式到 CRUD 全栈

本文从工厂模式切入,讲解 NestJS 模块化架构、Controller 与 Service 分层,基于内存存储实现 Todos 增删改查 API,并配套单元测试,适合前端转后端开发者学习。

2503_93701293的博客 195

设计模式精讲】27.模板方法模式(Template Method)

三个后台任务类各自手写同一套仪式——初始化、循环、异常捕获、收尾统计,三份代码长得像又各缺一角:有的忘了 try,有的收尾顺序不对,加「统一超时」要改三处将来 N 处。本文从仪式的复制讲起,给出模板方法的 GoF 意图:在基类固化算法骨架,把可变步骤延迟到子类——骨架非虚、钩子分「必填纯虚」与「可选默认」两档;C++ 特有的 NVI 惯用法(公有非虚 + 私有虚)与模板方法互为表里,现代版补上 final、函数注入版(骨架 + 局部策略)与 CRTP 编译期骨架;好莱坞原则「别调用我们,我们会调用你」是它的

码工许师傅 236

设计模式】装饰模式()实战:从计费系统的“动态加功能“说起

本文以计费系统中“动态加规则”需求为切入点,对比条件判断与继承模式的局限,提出用装饰模式解决功能灵活组合问题。通过将核心逻辑与装饰逻辑分离,实现零代码修改下按需组装不同计费流程,支持顺序自由调整、功能复用与可扩展性。关键在于统一接口、抽象装饰器持有接口引用,运行时通过多态动态绑定,使功能如“穿衣”般自由穿脱,真正实现开闭原则。

软件工程探索之旅 273

设计模式精讲】25.状态模式(State)

订单能支付、能发货、能关闭——每种动作在每种状态下都有不同答案,直觉的实现是给每个方法配一份全量 switch,于是「Created/Paid/Shipped」的分支在五个方法里各复制一遍,加一个状态全体加 case,合法的迁移图散落得没人能一眼看清。本文从订单状态机的 switch 蔓延讲起,给出状态模式的 GoF 意图:状态一变、行为整个换一套,对象「看起来像换了一个类」;状态对象无状态、全程共享一份(与享元、单例同宗),迁移由当前状态自己决定;现代版给出迁移表与 C++17 的 variant 值语义

码工许师傅 290

CSDN首页 发布文章 CSDN同步助手 无人机基于GWO算法、MP-GWO灰狼算法、灰狼-布谷鸟优化算法、CS-GWO多种群灰狼优化算法的无人机路径规划(Matlab代码实现) 70 10

内容概要:本文详细复现并实现了“电动汽车聚合可行域的内-外结合近似方法”的Matlab代码,旨在通过对大量电动汽车充放电能力的建模,构建其聚合可行域的内近似与外近似集合,从而科学刻画电动汽车集群作为柔性资源参与电网调度的整体潜力。研究基于多面体理论,系统阐述了电动汽车集群聚合建模的技术流程,并将其集成至包含分布式电源、储能系统及常规负荷的微电网经济调度模型中,验证该方法在提升系统运行经济性、灵活性与可再生能源消纳能力方面的有效性。文中不仅提供了完整的数学模型推导与优化框架,还深入分析了模型特性及其在虚拟电厂、车网互动(V2G)等新兴电力系统场景中的应用前景。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、科研人员,以及从事新能源并网、智能电网、需求响应和能源互联网相关领域的工程师与技术人员。; 使用场景及目标:①掌握基于多面体理论的电动汽车集群聚合建模方法,理解其作为“虚拟电池”参与系统调度的内在机理;②学习如何将海量异质个体的时空灵活性聚合为可操作的可行域,并应用于微电网或主动配电网的优化调度问题;③为开展车网互动(V2G)、分布式资源聚合、鲁棒调度、虚拟电厂等前沿课题的研究提供坚实的模型基础与可复用的代码参考。; 阅读建议:建议读者结合文中提供的Matlab代码,逐模块运行与调试,重点关注电动汽车个体可行域的构建、多面体聚合的内近似算法实现以及微电网调度模型中约束条件的耦合方式,鼓励通过修改参数、增删设备类型或扩展为多时段模型等方式进行二次开发,以深化对聚合机理与优化逻辑的理解。

QT5 calling DLL

代码下载链接: https://pan.quark.cn/s/a4b39357ea24 QT5代表了Qt软件框架的第五个核心版本,其作为一个广受欢迎的开放源代码跨平台软件应用开发框架,能够支持包括Windows、Linux以及macOS在内的多种操作系统平台。在QT5环境下对DLL(动态链接库)进行调用是一项普遍存在的工作需求,特别是在需要借助已有的C++代码或达成特定功能实现的情况下。接下来将系统性地阐述在QT5中如何进行DLL的调用操作。 1. **DLL的构建过程**: 在Windows系统环境中,首要任务是开发一个DLL项目。DLL通常承载一些可供外部应用程序调用的导出函数或类,它们构成了应用程序间的接口。在Qt Creator软件中,创建一个全新的项目,选择“Qt Console Application”类型,然后在.pro项目文件中增加`QT += core`声明,以保证基础库的可用性。随后,需要声明导出函数,并利用`__declspec(dllexport)`关键字进行标记。例如: ```cpp #ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif extern "C" MYDLL_API void myFunction() { // 函数实现代码 } ``` 2. **DLL的构建**: 完成DLL源代码的编写之后,需要对项目的构建配置进行设置,以便生成DLL文件。在.pro项目文件里,必须确保正确设置了构建类型,比如`CONFIG += dll`。然后执行项目编译操作,从而...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值