策模观迭 责命备 状访调解
-
观察者模式 (Observer)
例子:新闻订阅系统。用户(观察者)订阅某个新闻主题后,当该主题有新文章发布(主题状态变化),系统会自动通知所有订阅者。在这个例子中,用户类实现了观察者的角色,新闻主题类作为被观察者维护一个观察者列表,并在内容更新时调用观察者的更新方法。
-
策略模式 (Strategy)
例子:电商平台的运费计算规则。不同的商家可能有不同的运费计算策略,如按重量计费、按件数计费、满额包邮等。这些策略抽象为接口或抽象类,具体策略(如
WeightBasedShippingStrategy
、QuantityBasedShippingStrategy
、FreeShippingStrategy
)实现该接口。购物车系统根据用户选择的商品和商家,动态选择并应用相应的运费计算策略。 -
模板方法模式 (Template Method)
例子:软件开发过程中的构建流程。定义一个通用的构建流程模板(如初始化项目、编译代码、运行测试、打包部署等步骤),其中某些步骤(如编译和测试的具体实现)由子类(如Java项目构建子类、Python项目构建子类)去扩展或覆盖。这样,尽管不同类型的项目构建细节各异,但都可以遵循同一套标准化的构建流程模板。
-
职责链模式 (Chain of Responsibility)
例子:请假审批系统。员工提交请假申请后,请求会沿着审批链传递。每个审批人(节点)检查申请是否在其权限范围内,如果符合条件则审批通过,否则将请求转发给下一个审批人。直到找到有权审批的人或达到链尾。在这个例子中,每个审批人是一个职责链中的节点,负责处理或转发请求。
-
状态模式 (State)
例子:ATM取款机业务流程。取款机在不同状态下(如待机、交易中、故障等)对用户的操作(如插卡、输入密码、取款请求等)有不同的响应。状态模式通过创建表示各种状态的对象,并在状态改变时切换上下文所持状态对象,使得取款机可以根据当前状态正确处理用户操作。
-
迭代器模式 (Iterator)
例子:集合框架(如Java中的
ArrayList
)。集合类提供了一个迭代器接口,允许外部代码遍历集合中的元素而无需暴露集合的内部结构。客户端代码通过调用iterator()
方法获取迭代器实例,然后使用hasNext()
和next()
方法逐一访问集合元素,无需关心集合的实现细节(如数组还是链表)。 -
访问者模式 (Visitor)
例子:计算机硬件管理系统。系统需要收集不同类型硬件(如CPU、内存、硬盘等)的使用情况。为避免在每个硬件类中添加报告统计方法,引入访问者模式。定义一个访问者接口,每个具体访问者(如CPUUsageVisitor、MemoryUsageVisitor)实现针对特定硬件类型的数据收集逻辑。硬件类提供
accept(Visitor)
方法,让访问者对象访问并收集其状态。 -
备忘录模式 (Memento)
例子:文本编辑器的撤销/重做功能。编辑器在用户每次修改文档时,创建一个包含当前文档状态的备忘录对象(Memento),并将备忘录保存到历史栈中。当用户执行撤销操作时,编辑器从栈顶取出最近的备忘录,恢复其记录的文档状态;重做操作则相反,从栈中取出上一个撤销操作前的备忘录来恢复状态。
-
命令模式 (Command)
例子:图形用户界面(GUI)中的菜单系统。每个菜单项对应一个命令对象,如“打开文件”、“保存”等。命令对象封装了执行操作的请求(包括操作目标和参数)。点击菜单时,调用命令对象的
execute()
方法执行相应操作。命令模式支持操作的撤销/重做、队列化请求以及宏命令的构造。 -
解释器模式 (Interpreter)
例子:简单的数学表达式解析器。设计一个解释器接口,定义解释数学表达式的方法。然后为加减乘除等运算符以及数字创建具体的解释器子类。用户输入的表达式字符串被解析成一棵抽象语法树(AST),树的节点是解释器对象。通过递归调用解释器的解释方法,可以计算出表达式的值。
-
中介者模式 (Mediator)
例子:聊天室应用。聊天室内的多个用户(同事类)通过中介者(聊天室服务)进行消息传递,而不是直接相互交互。用户发送消息时通知中介者,中介者负责将消息广播给其他在线用户。这样简化了用户之间的交互关系,集中管理交互逻辑,并易于扩展和修改通信行为。
以上就是行为型设计模式的主要种类及其应用示例。这些模式旨在优化对象间的交互、职责分配及算法的组织,以提升软件系统的灵活性、可扩展性和可维护性。