当前位置: 首页 > news >正文

编程-笔记三:行为型设计模式-小结

笔记三:行为型设计模式

引言

行为型设计模式专注于定义对象之间的职责分配以及如何相互协作来解决问题。这些模式帮助我们定义对象如何交互以及如何分配职责,从而让代码更易于维护和扩展。

行为型模式的定义

行为型设计模式是一组用于描述类和对象如何交互以及如何分配职责的设计模式。它们通常涉及算法的封装、行为的抽象化以及对象间通信机制的设计。

为什么需要行为型模式
  • 灵活性:行为型模式允许在运行时动态地改变对象的行为,这使得程序更加灵活。
  • 解耦:通过使用行为型模式,可以降低对象之间的耦合度,使得对象更加独立。
  • 可扩展性:这些模式有助于在不修改现有代码的情况下添加新的行为或功能,使得系统更容易扩展。
小结
  • 行为型模式的共性

    • 这些模式主要关注于对象间的职责分配和通信方式。
    • 它们提供了一种方式来封装算法或行为,使得程序能够更加灵活地处理逻辑。
    • 行为型模式通常有助于降低系统的耦合度,使得程序更易于维护和扩展。
  • 何时使用这些模式

    • 当你需要在不改变现有类的前提下改变对象的行为时。
    • 当你需要动态地指定处理请求的对象时。
    • 当你需要在运行时动态地改变行为时。
    • 当你需要将算法从使用它的对象中分离出来时。
    • 当你需要定义一组相关或相互依赖的对象应该如何交互时。
    • 当你需要减少对象之间直接的依赖关系,提高系统的松耦合程度时。
行为型模式的共性
  • 封装算法:许多行为型模式将特定的算法或行为封装到独立的类中,使得算法可以独立于使用它的客户类而变化。
  • 分离关注点:通过将算法从对象结构中分离出来,可以单独修改算法而不影响对象结构,反之亦然。
  • 提高灵活性:这些模式提供了在运行时动态选择行为的能力,使得系统更加灵活多变。
  • 易于扩展:当需要添加新的行为时,可以通过简单地增加新类来实现,而无需修改现有代码。
何时使用这些模式
  • 责任链模式:当你需要让多个对象有机会处理一个请求时,可以将这些对象链接成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  • 命令模式:当你需要将请求封装为一个对象,从而使你可用不同的请求对客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作时。
  • 解释器模式:当你有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时。
  • 迭代器模式:当你需要遍历一个聚合对象时,但又不想暴露该对象的内部表示时。
  • 中介者模式:当你有一组对象以定义不良的方式相互通信,使得系统难以理解和维护时。
  • 备忘录模式:当你需要在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态时。
  • 观察者模式:当你有一个对象(主题)需要向多个其他对象(观察者)通知状态改变时。
  • 状态模式:当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时。
  • 空对象模式:当你需要消除检查 null 的需要,并提供一个合理的默认行为时。
  • 策略模式:当你需要定义一系列的算法,并将每个算法封装起来,使它们可以互相替换时。
  • 模板方法模式:当你需要定义算法的骨架,而将一些步骤留给子类去实现时。
  • 访问者模式:当你需要在不改变对象结构中的元素类的前提下定义新的操作时。

通过使用行为型设计模式,可以有效地组织对象之间的交互逻辑,提高软件系统的可扩展性和可维护性。这些模式有助于清晰地定义对象之间的职责分配和通信方式,从而简化复杂的系统设计。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 字符函数和字符串函数(2),C语言内存函数
  • JavaScript中的Truthy Falsy值以及等号判断
  • vue3中props无法watch
  • Midjourney入门-提示词基础撰写与公式
  • 01.小迪笔记2024 - day01-Web应用架构搭建站库分离路由访问配置受限DNS解析(不定期更新)
  • 中国第一台B超是在哪里产的?以及多普勒超声和B超、A超的区别
  • 如何选择适合的香港云服务器提供商?
  • 嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)
  • AI学习指南深度学习篇-卷积神经网络(CNN)简介
  • unity自动添加头部注释脚本
  • 机器学习——支持向量机(SVM)(1)
  • 用Manim创建条形图【BarChart】
  • IPSec之数据封装协议
  • 【practise】逆波兰表达式求值
  • 2024年大家最爱的翻译工具大盘点
  • Android单元测试 - 几个重要问题
  • co.js - 让异步代码同步化
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Laravel 实践之路: 数据库迁移与数据填充
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 前端技术周刊 2019-02-11 Serverless
  • 一个JAVA程序员成长之路分享
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 再次简单明了总结flex布局,一看就懂...
  • 智能合约开发环境搭建及Hello World合约
  • Hibernate主键生成策略及选择
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​flutter 代码混淆
  • # Apache SeaTunnel 究竟是什么?
  • # 数仓建模:如何构建主题宽表模型?
  • #includecmath
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (10)STL算法之搜索(二) 二分查找
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转载)(官方)UE4--图像编程----着色器开发
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .apk文件,IIS不支持下载解决
  • .cn根服务器被攻击之后
  • .Net CF下精确的计时器
  • .net core 6 集成和使用 mongodb
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 知识杂记
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 转载 ] SharePoint 资料
  • [2010-8-30]
  • [Android]Android开发入门之HelloWorld
  • [ASP]青辰网络考试管理系统NES X3.5