登录社区云,与社区用户共同成长
邀请您加入社区
相较于一般的有限状态机,HFSM多了一个“分层”的思想,通过继承关系呈现层次化结构,简化复杂系统的状态管理。即在普通平级有限状态机(FSM)基础上,引入父子层级结构的状态机设计模式。角色同一时刻必须且只能处于一种叶子状态,但上层父状态处于半活跃状态状态机中的状态数目是有限的必然有一个初始状态每个状态只负责当前状态的逻辑(逻辑解耦)状态之间的切换需有明确的条件,一般通过事件(Event)进行切换。
观察者模式介绍
本文系统介绍了系统设计的核心内容与方法论,涵盖结构化设计、面向对象设计、流程设计等关键技术。重点阐述了系统设计的七大原则:高内聚低耦合的模块设计、输入输出设计规范、人机交互五层模型(战略层到表现层)、安全可靠性设计等。详细解析了流程设计工具(流程图、IPO图等)、三种系统结构图类型(变换型、事务型、混合型)以及面向对象设计的三大类(实体类、控制类、边界类)。文章还特别强调了用户体验设计的黄金法则,
本文深入分析了SpringMVC框架中命令模式的设计思想与实现方式。文章首先阐述了命令模式在SpringMVC中的核心映射关系,包括抽象命令(Handler接口)、具体命令(Controller类)、调用者(DispatcherServlet)和接收者(Service/DAO层)的对应关系。
工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;单例模式:Bean默认为单例模式。代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
摘要:抽象工厂模式是一种构建型设计模式,专门用于成套创建属于同一"产品族"的对象(如UI组件、数据库驱动等)。它通过抽象工厂接口和具体工厂实现,确保生成的对象风格一致且相互兼容。该模式包含四个核心角色:抽象工厂、具体工厂、抽象产品和具体产品。相较于工厂方法模式,抽象工厂能创建整套产品族,但会增加系统复杂度。典型应用场景包括跨平台UI、数据库操作层、游戏开发等。虽然存在违反开闭原
Resource 接口是所有资源访问类所实现的接口,Resource 接口就代表资源访问策略,但具体采用哪种策略实现,Resource 接口并不理会。Spring 的三级缓存机制在处理单例 Bean 创建时,有类似的思想。Spring 中配置 DataSource 的时候,DataSource 可能是不同的数据库和数据源,项目需要连接多个数据库,这种模式让我们可以根据客户需求切换不同的数据源。这个
本文深入探讨Flutter跨平台开发框架的核心原理与工程实践。作者从技术架构、工程化落地和生产经验三大维度展开:首先解析Flutter自绘UI的渲染机制,包括Dart运行时、AOT/JIT编译模式、Skia引擎管线等底层原理;其次提供模块化项目结构设计、状态管理方案对比(Provider/Bloc/Riverpod)、性能优化等实战指南;最后分享国际化适配、CI/CD流程等生产级经验。通过架构图、
本文通过策略模式模拟了八路军在抗日战争中的战术选择。文章首先介绍了抗日时期的多种策略(游击战、根据地建设等),然后用C++实现策略模式:定义策略接口AntiJapaneseStrategy,具体策略类实现不同战术,上下文类EighthRouteArmy管理策略切换。示例展示了动态切换四种战术的过程,体现了策略模式在运行时灵活选择算法、降低耦合度的优势。该模式支持扩展新策略而无需修改现有代码,提升了
特性没有外观模式使用外观模式用户代码耦合性高必须了解每个子系统的细节和调用顺序隐藏子系统实现,仅暴露统一接口代码复用性重复调用多个系统封装逻辑,集中维护用户体验需要多步操作,容易出错一键下单,体验丝滑顺畅 🛫开发与维护成本每个地方都要处理子系统调用改变子系统不影响调用方。
在软件开发中,"代码坏味道"是指代码中可能存在问题或需要改进的结构特征。就像食物变质会发出异味一样,代码中的不良设计也会通过某些"症状"表现出来。
观察者模式(Observer Pattern)是一种行为型设计模式,用于建立对象间的一对多依赖关系。当一个对象(被观察者)状态发生变化时,所有依赖它的对象(观察者)都会自动收到通知并更新。这种模式通过解耦通知方与接收方,实现了系统的灵活性和可扩展性。特性传统实现观察者模式对象耦合度高低扩展性需修改现有代码支持开闭原则维护成本高低通知灵活性固定调用动态注册/注销适用场景复杂度简单场景复杂系统架构观察
比较维度硬编码处理代理模式处理结构清晰❌ 混乱✅ 职责分明易于扩展❌ 修改原类代码✅ 添加新代理类即可测试性好❌ 很难隔离测试✅ 每个代理功能可独立测试灵活组装❌ 所有逻辑耦合✅ 可按需组合代理链避免重复代码❌ 每个接口都要写一遍✅ 写一次代理,可全局复用。
咖啡制作是现实生活中运用模板方法模式的一个典型例子:虽然不同种类的咖啡(比如:浓缩咖啡、拿铁、卡布奇诺等)有不同的制作细节,但它们共享一个通用的流程框架。这个框架包括一些基本步骤,比如:加热水、冲泡咖啡、倒入杯中、添加调料。通过使用模板方法模式,我们可以定义这个通用的流程,并允许具体的咖啡类型自定义某些步骤。
交通信号灯是现实生活中运用状态模式的一个典型例子:红绿黄三种颜色代表了三种不同的状态,每个状态都有特定的行为和持续时间。比如:红色灯表示停止,绿色灯表示通行,黄色灯则提醒驾驶员准备停车。状态模式可以帮助管理系统中信号灯的状态转换逻辑,确保每次只有一种状态是激活的,并且根据预定的时间间隔自动切换到下一个状态。
生产者-消费者模型是并发编程的基础模式,通过分离数据生产和处理逻辑,提高系统吞吐量和可维护性。合理选择缓冲区类型和同步机制是实现高效、线程安全的关键。在实际应用中,需根据场景特点(如性能需求、数据量)调整实现方式。生产者-消费者模型(Producer-Consumer Model)是一种经典的并发编程模式,用于解决多线程或多进程环境下的数据共享和任务协作问题。
中介者模式是一种强大且灵活的设计模式,适用于需要优化对象间通信的场景。中介者模式通过引入一个中介对象,来封装一系列对象之间的交互。在没有中介者的情况下,这些对象之间可能会直接相互引用,导致系统中的类紧密耦合,难以维护和扩展。而通过使用中介者模式,可以将对象间的通信集中到一个中介者对象中,从而减少了对象之间的直接依赖,提高了系统的灵活性和可维护性。空中交通管制是现实生活中运用中介者模式的一个典型例子
与解释器模式、迭代器模式一样,备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态,并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式,开发者可以轻松添加诸如撤销/重做、快照等高级功能,提升用户体验。文本编辑器的撤销/重做功能是运用备忘录模式最典型的应用场景。当我们在文本编辑器中输入或修改内容时,编辑器会定期创建当前文档状态的“快照
与上一篇介绍的解释器模式一样,迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。简而言之,迭代器模式允许我们遍历集合数据结构中的元素,而不必了解这些集合的底层实现细节。音乐播放器是运用迭代器模式的一个典型例子:当我们使用音乐播放器听歌时,通常会有“下一首”、“上一首”的功能来切换歌曲。这里的歌曲播放列表就相当于一个聚合对象,而用于切换歌
面向对象设计原则和前人总结出来的设计模式是软件工程中非常重要的概念思想,主要为我们日常的开发中提供了一套完整的开发思想,帮助我们在日常开发中构建更加灵活、可维护和可扩展的系统。设计原则是“道”:提供指导思想,塑造代码哲学。设计模式是“术”:提供具体工具,解决特定问题。二者结合能写出高内聚、低耦合、易扩展的代码。
分层架构,简单来说,是将软件系统依据功能的不同,划分为多个层次。每一个层次都承载着独特的职责,这些职责紧密围绕系统的整体目标,又彼此独立,共同协作实现系统的完整功能。从逻辑视角看,各层如同搭建的积木,层层堆叠,下层为上层提供支撑服务,上层基于下层的能力进行更高级别的业务逻辑处理。层与层之间有着清晰的边界和规范的交互方式,通常上层依赖下层提供的接口来获取所需功能,而下层并不依赖上层的具体实现,这种单
作为一种行为设计模式,解释器模式提供了一种方法来定义语言的文法规则,并通过这些规则解析和处理特定类型的语言句子。简单来说,解释器模式允许我们定义一个代表某种语言中语法规则的对象结构,从而能够根据这些规则理解并处理语言中的表达式。表达式计算器是运用解释器模式的一个典型例子:想象一下,我们正在开发一个简单的数学表达式计算器,用户可以输入类似3 + (2 - 1)的表达式,并期望得到计算结果。在这种情况
在开发过程中,我们经常会遇到创建大量具有相似属性的对象的情况。比如:在一个图形编辑器中,可能有成千上万的小图标或文字字符;在一个游戏中,可能有大量的敌人、子弹等重复元素。如果每个这样的对象都独立存储其所有信息,将会占用大量的内存空间,并可能导致性能问题。为了优化这种情况,我们可以考虑只创建一份包含共同属性的数据副本,然后让不同的对象引用这份数据。同时,各自维护自己的独特属性。这就是享元模式的核心思
与前面介绍的组合模式、外观模式相同,代理模式也是一种结构型设计模式。代理模式非常实用,特别是在需要增强现有对象的功能、控制访问权限或是优化性能的情况下。简单来说,代理模式提供了一个对象来控制对另一个对象的访问。这个“代理”,就像一个中介或代表,负责管理客户端与目标对象之间的交互。房地产中介是现实生活中运用代理模式的一个典型例子:当我们想要购买或租赁房产时,通常会通过一家中介公司来处理;这个中介就是
与前一篇介绍的组合模式相同,外观模式也是一种结构型设计模式。通过引入一个外观类,将多个系统的接口整合成一个高层次的接口,使得客户端可以更容易地使用这些系统。这个模式的主要目的是:降低系统的耦合度,简化客户端与子系统之间的交互。汽车驾驶是现实生活中运用外观模式的一个典型例子:当我们驾驶一辆汽车时,实际上是在与多个复杂的子系统进行互动(比如:发动机系统、刹车系统、转向系统、空调系统等);然而,驾驶员并
组合模式是一种结构型设计模式,允许我们将对象组合成树形结构,以表示部分和整体的层次关系。通过这种方式,我们可以统一地处理单个对象和对象组合。换句话说,组合模式使得客户代码能够忽略对象的层次结构,以一致的方式对待个体和集合。文件系统是运用组合模式的一个典型例子:计算机上的文件夹(或目录)可以包含其他文件夹或文件,而文件夹本身又可以被包含在更大的文件夹中。这种层次化的结构,允许用户以一致的方式来处理单
与工厂方法模式、抽象工厂模式一样,原型模式也是一种对象创建型模式。它提供了一种创建对象的新方式:通过复制一个已有实例,来创建新的实例。这种方式避免了构造函数的局限性,特别是当对象的创建成本很高或初始化过程比较复杂时。在某些情况下,克隆现有对象可能比直接实例化新对象更高效。复印机是现实生活中运用原型模式的一个典型例子:当我们有一份纸质文档,并希望快速获得多份副本时,可以使用复印机来复制原始文档。这种
命令模式是一种行为设计模式,用于将请求封装成对象,从而使我们可以用不同的请求对客户进行参数化。简单来说,命令模式就是把一个请求转换为一个包含所有关于这个请求信息的对象。这样,就可以像传递其他对象一样传递这个请求,并且可以在适当的时间和地点执行它。命令模式主要适用于以下几种应用场景。1、需要支持撤销、重做操作的应用程序,比如:文本编辑器、绘图程序等。2、操作可以被放入队列中,并按顺序或特定条件执行的
模板方法设计模式是一种行为型设计模式。它包含一个抽象类(在Java和C++中)或者一个抽象基类(在Python中可以通过ABC抽象基类实现类似功能,在Go中通过接口和结构体组合来体现),这个抽象类中定义了一个模板方法,这个模板方法包含了算法的骨架,它按照一定的顺序调用其他的抽象方法或具体方法。抽象方法由子类去实现,从而实现不同的行为。
AI Agent智能工作流在多个行业中展现出实际应用的巨大潜力,这些智能体在编程、研究和多模态任务处理等领域的应用,智能体工作流将在未来几年内极大扩展AI的能力边界。无疑,这四种设计模式的结合使用,不仅能够提升AI Agent在单个任务中的执行能力,还为它在更广泛的应用场景中进行协作和创新提供了可能。随着这些模式的进一步发展和完善,AI Agent将在未来的工作流程中发挥更加关键的作用,推动各行各
在大型项目中,我们可能会遇到以下一些典型场景。1、需要使用一些现有的类,但其接口不符合要求。2、想要创建一个可以重复使用的类,该类可以与其他不相关的类或不可预见的类(即接口可能并不兼容的类)协同工作。3、需要使用第三方库或框架中的类,但是它们的接口与系统的其他部分不兼容。此时,如果直接修改这些类、库、组件或框架的源代码来适应新的要求,可能会破坏原有的功能或者违反开闭原则。为了解决这个问题,我们可以
在软件开发中,我们经常遇到需要给现有对象添加新功能的情况。最直接的方法是通过继承来实现,即创建一个子类,并重写或新增方法。然而,继承这种方式有如下几个缺点。1、违反开放封闭原则。开放封闭原则指出软件实体应该是对扩展开放的,但是对修改关闭的。使用继承来添加功能会使得我们必须修改已有的类,这显然不符合这一原则。2、代码膨胀。如果一个类有多种可选的行为,那么为了覆盖所有可能的组合,可能会导致大量的子类产
本篇是关于设计模式中介者模式、观察者(发布-订阅)模式、以及备忘录模式的学习笔记。
与前面提到的工厂方法模式、抽象工厂模式等创建型设计模式不同,观察者模式属于行为设计模式。行为设计模式主要关注对象之间的职责分配,以及它们之间的通信。通过行为设计模式,可以更加清晰地表达复杂的控制流,提高代码的可读性、灵活性和可维护性。新闻订阅系统是运用观察者模式的一个典型例子:每当有新的文章发布时,所有订阅了该频道的用户都会收到通知。观察者模式提供了一种松耦合的方式让对象之间相互通信,适用于需要处
前一篇文章中提到的工厂方法模式允许子类决定具体要创建的对象类型,但它一次只创建一个对象。抽象工厂模式则更加复杂,它关注的是创建一系列相关的对象。这些对象通常构成了一个完整的“家族”,并且在不同的实现中保持一致性和兼容性。跨平台的图形用户界面库(GUI,比如:QT、wxWidgets)是运用抽象工厂模式的一个典型例子:这些库需要为不同的操作系统(比如:Windows、macOS、Linux等)提供一
Sidecar 模式是一种容器设计模式,指的是在一个 Pod 中运行主容器和辅助容器(Sidecar 容器),二者共享 Pod 的资源(如网络和存储)。主容器负责核心业务逻辑,Sidecar 容器则负责为主容器提供增强功能,如日志收集、数据同步、服务代理等。
从设计模式的角度出发,设计一个遵循设计原则和规范的积分兑换系统,包括基本需求介绍、模块划分、数据库设计、接口设计、业务模型设计、部署方式等方面的设计方案。
在进行大型项目的系统架构设计时,确保某些类只有一个实例,是非常重要的。比如:日志记录器、数据库连接池、配置管理器等组件,通常只需要一个实例来处理所有请求。在这种情况下,如果每次使用都创建新的对象实例,不仅会浪费系统资源,还可能导致数据不一致。为了解决这一问题,单例模式应运而生。
使用设计模式时,一定要区分需求的稳定部分和可变部分。一个软件必然有稳定部分,这个部分就是核心业务逻辑。如果核心业务逻辑发生变化,软件就没有存在的必要,核心业务逻辑是我们需要固化的。对于可变的部分,需要判断可能发生变化的程度来确定设计策略和设计风险。考虑你的设计中什么可能会发生变化,考虑你允许什么发生变化而不让这一变化导致重新设计。设计模式的核心在于发现变化点,并封装之。另外,一种可变性不应散落在代
在软件开发的道路上,设计模式一直被视为提升代码质量和可维护性的关键工具。然而,对于初学者而言,即使学习了定义,也时常感到“似懂非懂”,难以将其付诸实践。为了强化自我,我在此记录了从实习到工作(24届)期间,实际项目中接触到的一些不错的设计实践。希望通过这些案例,能够帮助自己更好地理解和应用设计模式,锻炼文章书写能力,也希望对其他初学者有所启发。以上就是初入开发的我在实践中遇到的一些问题,是目前能力
看不懂算我输
AI Agent是指能够在特定环境中自主执行任务的人工智能系统,不仅接收任务,还自主制定和执行工作计划,并在过程中不断自我评估和调整,类似于人类在创造性任务中的思考和修正过程。AI Agent的四种关键设计模式是实现高效执行复杂任务的基础,共同构成了AI Agent的能力框架。本文将深入解析这四种关键设计模式。AI Agent的四种关键设计模式如下:反思:LLM检查自己的工作,以提出改进方法。使用
在现代软件开发中,设计模式不仅优化了代码结构,还提升了应用的灵活性与可维护性。特别是在Spring框架中,设计模式的应用成为了实现其强大功能的基石。
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象依次处理请求,避免请求的发送者和接收者之间的显式耦合。该模式通过将多个可能处理请求的对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。责任链模式为请求创建一个接收者对象的链。这种模式给予多个对象处理请求的机会,从而解耦发送者和接收者。
观察者模式(Observer Pattern)是一种行为设计模式。它允许一个对象(称为主题或可观察者)来监视并通知一组依赖于这个对象的其他对象(称为观察者),以便在主题状态发生变化时自动更新观察者的对象。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有注册过的观察者对象,使它们能够自动更新自己。观察者模式通过定义了一种一对多的依赖关
模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法模式是指在一个方法中定义一个算法的骨架,并将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变算法的结构即可重定义算法的某些特定步骤。模板方法模式通过在抽象类中定义一个操作
桥接模式(Bridge Pattern)是一种结构型设计模式,通过将抽象部分与它的实现部分分离,使它们都能够独立地变化。它的核心思想是将接口与实现解耦,从而使得两者可以独立地变化。桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式是一个强大且灵活的设计模式,通过将抽象与实现分离,降低了系统的耦合度和复杂性。虽然引入了额外的抽象层,但在需要高度灵活性和可扩展性的场景中,它提供了一
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变对象结构的前提下,定义作用于这些对象的新操作。这种模式通过将操作逻辑从对象结构中抽离出来,使得新的操作可以无缝地添加到现有对象中。访问者模式定义了一个访问者接口,它包含了访问不同元素的操作方法。具体的元素类接受访问者并调用相应的访问方法。通过这种分离,新增的操作可以直接通过访问者来实现,而不需要修改元素类。访问者模式
中介者模式(Mediator Pattern)是一种行为型设计模式,用于减少对象之间的复杂通信和依赖。它通过引入一个中介者对象来封装对象之间的交互,从而使得对象之间不直接相互依赖,而是通过中介者进行通信。中介者模式将对象之间的通信封装到一个中介者对象中,使各对象不再直接引用彼此,从而减少对象之间的耦合度。中介者模式通过引入一个中介者对象,将对象之间的复杂通信逻辑封装起来,从而降低对象之间的耦合度,