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

软件详细设计总复习(三)【太原理工大学】

题型及分值:
选择 30 分,填空 20 分, 判断 10 分,简答 20 分,综合设计 20 分。

文章目录

    • 三、行为型模式
      • 1. 命令模式
      • 2. 迭代器模式
      • 3. 观察者模式
      • 4. 状态模式
      • 5. 策略模式

三、行为型模式

1. 命令模式

举个例子,总经理要向公司的所有员工传达一些命令,但他不可能亲自去通知所有人,而是先把要吩咐的话通知给各部门负责人,再由各部门的负责人去向下传达指令,总经理和具体的员工之间是没有直接交流的,这就是命令模式。

将一个请求封装为一个对象,从而让你可以用不同的请求对客户迚行参数化,对请求排队戒者记录请求日志,以及支持可撤销的操作。

整体结构:
① 一个抽象命令类,内置公共命令方法;
② 数个具体命令类,重写父类的命令方法,并在里面调用接收者的接收方法;
③ 数个接收类,内置具体的接收方法;
④ 数个调用者类,即命令类与接收类的桥梁,通过带参构造方法传入命令类,自定义 call 方法,里面调用命令类的命令方法。

public public abstract class Command {public abstract void execute( );
}
public class ConcreteCommand extends Command {private Receiver receiver; //维持一个对请求接收者对象的引用public void execute() {receiver.action( ); //调用请求接收者的业务处理方法action( )}
}
public class Receiver {public void action( ) {//具体操作}
}
public class Invoker {private Command command;public Invoker(Command command) {this.command = command;}public void setCommand(Command command) {this.command = command;} public void call() {command.execute( );}
}

2. 迭代器模式

迭代器模式,顾名思义,它就是用来访问聚合对象的,对于遥控器和电视机,此时遥控器就是一个迭代器,而电视机就是它所对应的聚合对象,人们根本不需要关心这些频道是如何存储到电视里面的,他们只知道如何去用就可以了。为了拓展方便,需要定义一个抽象迭代器和一个抽象聚合类,在具体的聚合类中自然要调用迭代器中的方法,去进行电视台的迭代,这里可以按照课本上的方法,将具体的迭代器类作为具体聚合类的内部类,就是说我们不必要再去创建具体的迭代器类了,但全部功能都放在具体聚合类中有违开闭原则,因为迭代器也可能增加新的功能,所以也可以直接创一个具体迭代器类,在聚合类中直接传参并调用具体迭代器类即可。

迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成。

整体结构:
① 一个抽象迭代器类;
②一个具体迭代器类,遥控器,内置正、逆遍历方法,及一些判断开始和结尾的方法;
③ 一个抽象聚合类;
④ 数个具体聚合类,不同的电视机,内置频道,及创建迭代器的方法。

public interface TVIterator {void next();void previous();boolean isFirst();boolean isLast();//设置电视台void setChannel(int i);//返回当前电视台Object currentChannel();}
public class TVIteratorImpl implements TVIterator {Object[] obj;private int currentIndex = 0;public TVIteratorImpl(Object[] obj) {this.obj = obj;}@Overridepublic void next() {if (currentIndex < obj.length) {currentIndex++;}}@Overridepublic void previous() {if (currentIndex > 0) {currentIndex--;}}@Overridepublic boolean isFirst() {return currentIndex == 0;}@Overridepublic boolean isLast() {return currentIndex == obj.length;}@Overridepublic void setChannel(int i) {currentIndex = i;}@Overridepublic Object currentChannel() {return obj[currentIndex];}}
public interface Television {TVIterator createIterator();
}
public class HuaWeiTelevision implements Television {Object[] obj = {"少儿频道", "中央卫视", "山西卫视", "湖南卫视", "电影频道", "江西卫视", "青海卫视"};@Overridepublic TVIterator createIterator() {return new TVIteratorImpl(obj);}}

3. 观察者模式

一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变,它们之间将产生联劢。
还是以实验内容为例,股民观察股票价格动荡,从而做出反应。一个对象的改变将导致一个或多个其他对象发生改变,并且不知道具体有多少对象将发生改变,也不知道这些对象是谁。解决办法,在系统中创建一个触发链。一个目标可以有很多的观察者,在目标类中添加方法实现对观察者的增加和删除,同时目标类是要发出警告消息的,提供一个notify方法用于通知每一个观察者这里发出一个警告,所有的观察者都必须对此警告作为相应的反应,实现方式是遍历观察者集合,并调用其update方法,观察者类中的update方法就是观察者收到警告后做出的反应。

观察者模式定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

整体结构:
① 一个目标类,内置添加或删除观察者的方法,所有的观察者都被放在一个集合里面,再写一个通知方法,里面遍历集合中所有的观察者,并调用它们各自的 upDate 方法,当外部调用通知方法的时候,就相当于把通知传达给了各观察者;
② 一个抽象观察者类,提供 update 方法;
③ 数个观察者类,重写抽象观察者中的方法,当面对一个通知的时候所应该做出的反应。

import java.util.ArrayList;public class Stock {private String StockName;private int price;ArrayList<Investor> investors = new ArrayList<>();public void attach(Investor investor) {investors.add(investor);}public void detach(Investor investor) {investors.remove(investor);}public String getStockName() {return StockName;}public void setStockName(String stockName) {StockName = stockName;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public void notifyInvestor() {System.out.println("\n通知:" + StockName + "股票价格变化幅度已达 5%,最新价格为" + price + "¥。");System.out.println("*******************************************************************\n");for (Investor i : investors) {i.upDate();}}}
public abstract class Investor {public abstract void upDate();
}
public class ConcreteInvestor1 extends Investor {@Overridepublic void upDate() {System.out.println("股民1:怎么又变了,我真的会谢哦~");}
}public class ConcreteInvestor2 extends Investor {@Overridepublic void upDate() {System.out.println("股民2:变得好,正好不想买了~");}
}public class ConcreteInvestor3 extends Investor {@Overridepublic void upDate() {System.out.println("股民3:无欲无求,乃人生最大的乐趣~");}
}

4. 状态模式

该模式不太重要又难,所以我们不用硬看这个状态模式。
状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

整体结构:
① 一个抽象状态类;
② 数个具体状态类;
③ 数个环境类。

public class Context {private State state; //维持一个对抽象状态对象的引用private int value; //其他属性值,其变化可能会导致对象的状态变化public void setState(State state) {this.state = state;}public void request() {state.handle( ); //调用状态对象的业务方法}
}

5. 策略模式

策略模式中包含策略类和环境类。具体策略类可以有很多,继承至抽象策略类,环境类其实是使用策略的角色,在环境类中维护一个对抽象策略类的引用实例,用于定义所采用的策略。在测试类中给环境类传入具体策略参数,继而在环境类中调用具体策略类的处理方法,最后在控制台输出结果。

策略模式定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。实现某个目标的途径不止一条,可根据实际情况选择一条合适的途径。
在这里插入图片描述

整体结构:
① 一个抽象策略类;
② 数个具体策略类,重写抽象方法;
③ 一个环境类,客户端传入一种策略,由环境类来调用具体的策略方法。

public interface TravelStrategy {void travel();
}
public class AirplaneStrategy implements TravelStrategy {@Overridepublic void travel() {System.out.println("飞机旅行!");}
}public class TrainStrategy implements TravelStrategy {@Overridepublic void travel() {System.out.println("火车旅行!");}
}
public class Person {private TravelStrategy strategy;public void setStrategy(TravelStrategy strategy) {this.strategy = strategy;}public void travel() {strategy.travel();}}

相关文章:

软件详细设计总复习(三)【太原理工大学】

题型及分值&#xff1a; 选择 30 分&#xff0c;填空 20 分&#xff0c; 判断 10 分&#xff0c;简答 20 分&#xff0c;综合设计 20 分。 文章目录 三、行为型模式1. 命令模式2. 迭代器模式3. 观察者模式4. 状态模式5. 策略模式 三、行为型模式 1. 命令模式 举个例子&#x…...

Vue3(一):创建vue3工程、setup、vue3响应式原理、computed和watch

Vue3&#xff1a;第一章 一、创建Vue3.0工程1.使用vue-cli创建2.使用vite创建 二、Vue3中的响应式1.拉开序幕的setup2.ref函数3.reactive函数4.vue3中响应式的原理&#xff08;1&#xff09;vue2中响应式原理&#xff08;2&#xff09;Vue3中的Proxy 5.reactive和ref的对比6.se…...

Spring中的@Value注解详解

Spring中的Value注解详解 概述 本文配置文件为yml文件 在使用spring框架的项目中&#xff0c;Value是经常使用的注解之一。其功能是将与配置文件中的键对应的值分配给其带注解的属性。在日常使用中&#xff0c;我们常用的功能相对简单。本文使您系统地了解Value的用法。 Value…...

YSL赢麻了?SMI社媒心智品牌榜Top20公布:YSL破局夺魁,国货品牌现后起之秀

全文速览 1.数说故事联合用户说从美妆、彩妆、护肤三板块全新发布《SMI社媒心智品牌榜》。 2.圣罗兰、兰蔻、欧莱雅等法国高端美妆大牌垄断美妆《SMI社媒心智品牌榜》前三甲。 3.彩妆Top20榜单中&#xff0c;底妆产品稳居前列&#xff0c;色彩美妆占据一席之地。 4.护肤TOP…...

链式哈希,一致性哈希,倒排表

在普通的查询中&#xff0c;通过关键码的比较进行查找&#xff0c;而哈希是根据关键码直接定位到数据项 哈希冲突&#xff1a;同一个关键码经过哈希函数后指向同一个记录集 链式哈希 using namespace std; #define M 13 typedef int KeyType; //typedef struct //{ // KeyTyp…...

Python操作XML教程:读取、写入、修改和保存XML文档

目录 导入所需模块解析XML文档获取元素遍历XML文档写入新的元素修改元素的内容和属性删除元素保存修改后的XML文档示例演示python操作xml的常用方法 XML是一种常见的数据交换格式&#xff0c;在许多应用中都被广泛使用。通过掌握Python操作XML的基础知识&#xff0c;您将能够轻…...

Oracle数据库中了locked1勒索病毒,用友nchome配置文件损坏该如何解除

随着互联网技术的不断发展&#xff0c;网络安全问题也越来越受到人们的关注。其中&#xff0c;勒索病毒是一种比较常见的网络安全威胁。最近很多集团企业在使用Oracle数据库的过程中&#xff0c;遭遇到了locked1勒索病毒的攻击&#xff0c;导致企业的用友nchome配置文件损坏&am…...

leecode 数据库: 602. 好友申请 II :谁有最多的好友

数据导入&#xff1a; Create table If Not Exists RequestAccepted (requester_id int not null, accepter_id int null, accept_date date null); Truncate table RequestAccepted; insert into RequestAccepted (requester_id, accepter_id, accept_date) values (1, 2, 20…...

基于 Prometheus 的 SLO告警实战

Prometheus是一个流行的开源监控系统&#xff0c;它可以帮助我们收集、存储和查询应用程序或系统的时间序列数据。在使用Prometheus进行监控时&#xff0c;通常需要根据服务水平指标&#xff08;Service Level Objectives&#xff0c;简称SLO&#xff09;来设置告警规则。 SLO…...

调用百度API实现图像风格转换

目录 1、作者介绍2、基本概念2.1 人工智能云服务与百度智能云2.2 图像风格转换 3、调用百度API实现图像风格转换3.1 配置百度智能云平台3.2 环境配置3.3 完整代码实现3.4 效果展示3.5 问题与分析 1、作者介绍 张元帮&#xff0c;男&#xff0c;西安工程大学电子信息学院&#…...

5个最好的WooCommerce商城自动化动作来增加销售量

您是否正在寻找简单智能的方法来自动执行任务并增加 WooCommerce 商店的销售额&#xff1f; 通过在线商店中的自动化任务&#xff0c;您可以在发展业务和增加销售额的同时节省时间和金钱。 在本文中&#xff0c;我们将向您展示如何使用 WooCommerce商城自动化来增加销售额。 …...

打开数据结构大门——实现小小顺序表

文章目录 前言顺序表的概念及分类搭建项目&#xff08;Seqlist&#xff09;:apple:搭建一个顺序表结构&&定义所需头文件&&函数:banana:初始化:pear:打印:watermelon:数据个数:smile:检查容量:fireworks:判空:tea:在尾部插入数据:tomato:在尾部删除数据:lemon:在…...

一.RxJava

1.RxJava使用场景 RxJava核心思想 Rx思维:响应式编程,从起点到终点,中途不能断掉,并且可以在中途添加拦截. 生活中的例子: 起点(分发事件,我饿了)->下楼->去餐厅->点餐->终点(吃饭,消费事件) 程序中的例子: 起点(分发事件,点击登录)->登录API->请求服务器-…...

如何使用 VSCode 软件运行C代码

VSCode 的下载和扩展的配置可以参考文章&#xff1a;VSCode 的安装与插件配置。 VSCode 是很好用的编辑器&#xff0c;通过给其配置 MinGW-w64 插件就可以在它上面编译运行C代码了。 在没有配置 MinGW-w64 插件时&#xff0c;在 VSCode 中运行下面的代码后打印如下图所示。 这…...

C# 调用Matlab打包的 DLL文件(傻瓜式操作)

1、准备Matlab代码 2. 打包 在matlab命令行窗口输入deploytool,打开MATLAB Complier,选择Library Compiler 在TYPE中选择.NET Assembly;在EXPORTED FUNCTIONS中选择要打包的文件&#xff1b;可以选择为自己打包的文件自定义NameSpace名称&#xff0c;本例中将NameSpace定义为…...

微信小程序学习实录3(环境部署、百度地图微信小程序、单击更换图标、弹窗信息、导航、支持腾讯百度高德地图调起)

百度地图微信小程序 一、环境部署1.need to be declared in the requiredPrivateInfos2.api.map.baidu.com 不在以下 request 合法域名3.width and heigth of marker id 9 are required 二、核心代码&#xff08;一&#xff09;逻辑层index.js&#xff08;二&#xff09;渲染层…...

【面试题】中高级前端工程师都需要熟悉的技能--前端缓存

前端缓存 一、前言二、web缓存分类1. HTTP缓存&#xff1a;2. 浏览器缓存&#xff1a;3. Service Worker&#xff1a;4. Web Storage缓存&#xff1a;5. 内存缓存&#xff1a; 三、http缓存详解1、http缓存类型a. 基于有效时间的缓存控制&#xff1a;b. 基于资源标识的缓存&…...

小红书数据分析:首播卖6亿,小红书直播开启新纪元!

5月22日&#xff0c;章小蕙在小红书开启了第一场带货直播。继董洁之后&#xff0c;小红书又迎来一位超级带货KOL。 据千瓜数据显示&#xff0c;相关话题#章小蕙小红书直播#上线不到30天&#xff0c;话题浏览量就高达2814.89万&#xff0c;笔记互动量达22.24万。 图 | 千瓜数据…...

Weex中,关于组件的水平排列竖直排列居中对齐居左对齐居右对齐低部对齐顶部对齐布局对齐说明

容器内子组件排列方向 子组件竖直方向排列&#xff08;默认&#xff09; 子组件水平方向排列 <style> .container {flex-direction: row;direction: ltr; } </style>子组件在父组件容器中的对齐方式 我们主要使用两个属性实现子组件在父组件的对齐方式&#xff…...

服务(第二十八篇)rsync

配置rsync源服务器&#xff1a; #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...