软件设计师-重点的行为型设计模式

一、命令模式(Command):

意图:(上午题)

  • 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

结构:

适用性:

  • 抽象出待执行的动作,以参数化某对象。Command模式是过程语言中,回调(Callback)机制的一个面向对象的替代品。
  • 在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可以将负责该请求的命令对象传递给另一个不同的进程并在那儿实现该请求。
  • 支持取消操作。Command的Execute操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command 接口必须添加一个 Unexecute 操作,该操作取消上一次 Execute 调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute 和Execute来实现重数不限的“取消”和“重做”。
  • 支持修改日志。这样当系统崩溃时,这些修改可以被重做一遍。在 Command 接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用 Execute 操作重新执行它们。

二、中介模式/调停者模式(Mediator):

意图:

  • 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

结构:

适用性:

  • 一组对象以定义良好,但是复杂的方式进行通信,产生的相互依赖关系结构混乱,且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

三、状态模式(State):

意图:

  • 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

结构:

适用性:

  • 一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得开发者可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象独立变化。

四、访问模式(Visitor):

意图:

  • 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下,定义作用于这些元素的新操作。

结构:

适用性:

  • 一个对象结构包含很多类对象,它们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操作。**
  • 需要对一个对象结构中的对象进行很多不同的,并且不相关的操作,而又想要避免这些操作“污染”这些对象的类。Visitor 使得用户可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用 Visitor 模式让每个应用仅包含需要用到的操作。
  • 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变.那么可能还是在这些类中定义这些操作较好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/583835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django-基础篇

Django是一个开放源代码的Web应用框架,由Python语言编写。它遵循MVC(Model-View-Controller)的软件设计模式,使开发者能够以高效、可扩展和安全的方式构建Web应用程序。 Django具有以下特点和优势: 强大的功能&#x…

[技术小技巧] 可视化分析:在jupyter中使用d3可视化树形结构

首先在python中定义一个字符串,记录d3.js绘制属性图的js脚本代码模版。其中{{data}}就是将来要被替换的内容。 d3_code_template """ // 创建树状结构数据 var treeData {{data}};// 创建d3树布局 var margin { top: 20, right: 90, bottom: 30,…

行业推荐:数据防泄漏软件首先解决方案

随着信息时代的快速发展,数据安全已成为企业经营的关键之一。然而,数据泄漏事件时有发生,不仅可能导致巨大的经济损失,更会损害企业的声誉和客户信任。 为了帮助企业有效地保护数据安全,Ping32 数据防泄漏系统应运而生…

【跟我学RISC-V】认识RISC-V指令集并搭建实验环境

写在前面 现在计算机的体系架构正是发展得如火如荼的时候,占领桌面端市场的x86架构、占领移动端市场的arm架构、在服务器市场仍有一定地位的mips架构、国产自研的指令集loongarch架构、还有我现在要讲到的新型开源开放的RISC-V指令集架构。 我先说一说我的学习经历…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分,而Facebook作为其中最具影响力的平台之一,不仅改变了人们之间的社交方式,也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点,以及它如何塑造和改变…

【C++题解】1608. 三位数运算

问题:1608. 三位数运算 类型:基本运算、拆位求解 题目描述: 小丽在编程课上学会了拆位运算,她已经可以拆出一个三位整数的百位、十位和个位了,她想知道这个整数的(百位 十位) / (…

Web3与智能合约:科技革新下的新金融时代

在当今数字化时代,Web3和智能合约正在共同塑造着金融领域的未来。Web3作为下一代互联网的重要组成部分,以其去中心化、安全性和透明性为核心特点,正推动着金融行业向着数字化和去中心化的方向发展。而智能合约作为Web3技术的关键应用之一&…

虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X

原因:VMware自动选择的网卡可能不对 解决:编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡,断开虚拟机网络连接后重新连接即可

Docker(Docker的安装和介绍,常用命令,镜像制作,服务编排,docker私服)

目录 一、简介 1. docker简介 1 什么是docker 2 容器和虚拟机对比 2. 安装docker 1 docker相关概念 2 安装docker 1 安装docker 2 设置注册中心(仓库) 3. 小结 二、常用命令【重点】 1. 服务管理 2. 镜像管理 1 语法说明 2 使用练习 3. 容器管理 1 容器介绍 2…

2024.4.25 LoadRunner 测试工具详解 —— Controller Analysis

目录 Controller 的使用 创建场景 Controller 快捷方式创建场景 VUG 针对写好脚本创建场景 场景设计 设计初始化 设计启动机制 设计性能测试脚本的执行时间 设计虚拟用户退出机制 场景运行 添加监控指标至图标格区域 Analysis 的使用 汇总报告 测试报表 吞吐量图 …

Dockerfile实战---构建SSH、Tomcat、MySQL、Nginx镜像

目录 引言 一、安装docker程序 二、构建SSH镜像 1.创建镜像 2.基于sshd镜像创建容器 三、构建tomcat镜像 1.创建镜像 2.基于tomcat镜像创建容器 四、构建MySQL镜像 1.创建镜像 2.基于mysqld镜像创建容器 五、构建nginx镜像 1.创建镜像 2.基于nginx镜像创建容器 引…

用Stream流方式合并两个list集合(部分对象属性重合)

一、合并出共有部分 package com.xu.demo.test;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class ListMergeTest1 {public static void main(String[] args) {List<User> list1 Arrays.asList(new User(1, "Alic…

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢&#xff1f; 理解TIME_WAIT状态 流量控制&#xff08;可靠性效率&#xff09; 滑动窗口 拥塞…

Java8中的Stream流相关用法学习

目录 一、Stream是什么 二、创建Stream 三、中间操作 3.1 filter() 3.2 map() 3.3 flatMap() 3.4 distinct() 3.5 limit() 四、终端操作 4.1 findAny(), 和 orElse() 4.2 sorted() 4.3 forEach() 4.4 count() 4.5 collect() 4.6 groupingBy() 4.7 average() 4…

RAG-Driver: 多模态大语言模型中具有检索增强上下文学习的通用驱动解释

RAG-Driver: 多模态大语言模型中具有检索增强上下文学习的通用驱动解释 摘要Introduction RAG-Driver: Generalisable Driving Explanations with Retrieval-Augmented In-Context Learning in Multi-Modal Large Language Model. 摘要 由“黑箱”模型驱动的机器人需要提供人类…

Java对接高德api搜索POI 2.0 关键字搜索

目录 一、注册账号 二、搜索小demo 1.首先要引入依赖 2. 然后查看打印结果即可 三、搜索接口代码 1.引入依赖 2.yml配置 2.Controller 3.静态工具类 四、运行测试 一、注册账号 高德开放平台 | 高德地图API 注册高德开发者&#xff1b;去控制台创建应用&#xff…

【Python网络爬虫】python爬虫用正则表达式进行数据清洗与处理

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

机器学习:深入解析SVM的核心概念(问题与解答篇)【三、核函数】

核函数 **问题一&#xff1a;为什么说是有限维就一定存在高维空间可分呢&#xff1f;**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二&#xff1a;最终怎么得到函数**从对偶问题到决策函数的步骤&#xff1a;结论 **问题三&#xff1a;为什么说特征…

c#数据库: 6.查询成绩合格的学生/7.输出全部学生信息

SQL Server Management Studio Management Studio 中的学生信息表: 查询上图成绩合格的学生信息&#xff0c;并将信息从控制台输出 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text…

【弱监督语义分割】AllSpark:从transformer中的未标记特征重生标记特征,用于半监督语义分割

AllSpark: Reborn Labeled Features from Unlabeled in Transformer for Semi-Supervised Semantic Segmentation 摘要&#xff1a; 目前最先进的方法是用真实标签训练标注数据&#xff0c;用伪标签训练未标注数据。然而&#xff0c;这两个训练流程是分开的&#xff0c;这就使…