概念说明
大话设计模式
大话设计模式主要分为三部分,第一部分是创建型模式,第二部分是结构型模式,第三部分是行为型模式。至于为什么要分为这三部分,我的理解是创建型是用于创建对象的而结构型是发生在类与类之间的关系是比较宏观的,比如说组合或者交互。行为型是一个微观的关系主要体现在对象与对象之间和方法与方法之间。接下来说一说行为型模式。
行为型模式
行为型模式用于描述程序在运行时复杂的流程控制,即描述对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,是一种微观关系的体现。行为型模式包括:第一组(观察者模式、模板方法、命令模式、状态模式、职责链模式)第二组(解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式)
各模式详解
第一组
观察者模式(Observer Pattern)
好处:定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象的状态变化。解耦了主题和观察者之间的依赖关系,提高了代码的灵活性和可扩展性。
使用场景:当一个对象的状态变化需要通知其他对象,并且不希望对象之间紧密耦合时,可以使用观察者模式。例如,新闻订阅、事件通知等场景。
模板方法模式(Template Method Pattern)
好处:定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。提供了一种固定的算法结构,同时允许子类灵活地实现自己的具体步骤。
使用场景:当有一个算法的整体结构是固定的,但其中某些步骤的具体实现可能有所变化时,可以使用模板方法模式。例如,游戏中的角色行为、数据库访问操作等场景。
命令模式(Command Pattern)
好处:将请求封装成一个对象,使得可以将请求的发送者和接收者解耦。提供了一种灵活的方式来组织和执行命令,支持撤销、重做等操作。
使用场景:当需要将请求封装成对象,并且支持撤销、重做等操作时,可以使用命令模式。例如,遥控器控制电器、菜单项的点击操作等场景。
状态模式(State Pattern)
好处:将对象的状态抽象成独立的状态类,使得对象在不同状态下可以有不同的行为。将状态的切换逻辑封装到状态类中,使得状态转换逻辑更加清晰和可维护。
使用场景:当一个对象的行为取决于它的状态,并且需要在运行时动态地改变对象的状态时,可以使用状态模式。例如,订单的状态转换、游戏中角色的状态转换等场景。
职责链模式(Chain of Responsibility Pattern)
好处:将请求的发送者和接收者解耦,使得多个对象都有机会处理请求。提供了一种灵活的方式来组织和执行责任链,可以动态地改变责任链的结构。
使用场景:当需要将请求的发送者和接收者解耦,并且希望多个对象都有机会处理请求时,可以使用责任链模式。例如,请求的处理链、日志记录的链式处理等场景。
第一组总结分类
分类只从每个模式的类图中是否体现了聚合关系,也可以说从他们之间关系的强弱来进行区分,无聚合关系比较弱,有聚合关系就比较强。
第二组
解释器模式(Interpreter Pattern)
好处:将一个复杂的语言或规则表达式分解为一系列简单的解释器,使得解释器的添加和修改变得灵活和可扩展。提供了一种简洁的方式来解释和处理特定的语法规则。
使用场景:当需要解析和处理一种特定的语言或规则,且需要灵活地添加和修改解释器时,可以使用解释器模式。例如,编译器的语法分析、正则表达式的解析等场景。
中介者模式(Mediator Pattern)
好处:共享细粒度的对象,减少内存使用,提高性能。通过共享,可以在有限的内存中支持大量的对象。
使用场景:当需要创建大量相似的对象,并且这些对象可以共享部分状态时,可以使用享元模式。例如,字符缓存池、线程池等。
访问者模式(Visitor Pattern)
好处:共享细粒度的对象,减少内存使用,提高性能。通过共享,可以在有限的内存中支持大量的对象。
使用场景:当需要创建大量相似的对象,并且这些对象可以共享部分状态时,可以使用享元模式。例如,字符缓存池、线程池等。
策略模式(Strategy Pattern)
好处:定义了一系列算法,并将每个算法封装到独立的策略类中,使得它们可以互相替换。提供了一种灵活的方式来选择和使用不同的算法,而不需要修改客户端代码。
使用场景:当需要在运行时选择不同的算法,或者需要根据不同的条件使用不同的算法时,可以使用策略模式。例如,支付方式的选择、排序算法的选择等场景。
备忘录模式(Memento Pattern)
好处:备忘录模式可以在不破坏封装性的前提下,捕获和保存一个对象的内部状态,并提供一种恢复到之前状态的机制。它可以有效地实现对象的撤销、恢复和历史记录功能。
使用场景:当需要实现对象的撤销、恢复和历史记录功能时,可以使用备忘录模式。例如,文本编辑器的撤销和恢复功能、游戏中的进度保存和恢复功能等场景。
迭代器模式(Iterator Pattern)
好处:提供了一种统一的方式来访问聚合对象中的元素,而不需要暴露聚合对象的内部表示。简化了聚合对象的遍历和操作。
使用场景:当需要遍历和操作聚合对象中的元素,且不希望暴露聚合对象的内部表示时,可以使用迭代器模式。例如,集合类中的迭代操作、文件系统中的目录遍历等场景。
第二组总结和分类
一:代表只选择一个对象。比如说策略模式,可以有很多的策略但是最后选择的只有一个对象。
多:代表需要便利多个对象。比如说中介者模式中的例子,具体中介者可以知道很多的具体的同时,但是同事和同事之间是互相不了解的。对于中介者和同事之见就是一对多的关系。
其他模式
创建型模式:https://blog.csdn.net/weixin_45490198/article/details/131432094
结构型模式:https://blog.csdn.net/weixin_45490198/article/details/131432715
总结提升
这些行为型设计模式都提供了一种灵活、可复用和可扩展的方式来组织和管理对象之间的交互和通信。正确地选择和使用适合的设计模式可以提高代码的可维护性、可读性和可测试性,并帮助我们构建更好的软件系统。