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

news2024/11/18 18:29:52

题型及分值:
选择 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;
    }

    @Override
    public void next() {
        if (currentIndex < obj.length) {
            currentIndex++;
        }
    }
    @Override
    public void previous() {
        if (currentIndex > 0) {
            currentIndex--;
        }
    }
    @Override
    public boolean isFirst() {
        return currentIndex == 0;
    }
    @Override
    public boolean isLast() {
        return currentIndex == obj.length;
    }
    @Override
    public void setChannel(int i) {
        currentIndex = i;
    }
    @Override
    public Object currentChannel() {
        return obj[currentIndex];
    }

}
public interface Television {
    TVIterator createIterator();
}
public class HuaWeiTelevision implements Television {

    Object[] obj = {"少儿频道", "中央卫视", "山西卫视", "湖南卫视", "电影频道", "江西卫视", "青海卫视"};

    @Override
    public 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 {
    @Override
    public void upDate() {
        System.out.println("股民1:怎么又变了,我真的会谢哦~");
    }
}

public class ConcreteInvestor2 extends Investor {
    @Override
    public void upDate() {
        System.out.println("股民2:变得好,正好不想买了~");
    }
}

public class ConcreteInvestor3 extends Investor {
    @Override
    public 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 {
    @Override
    public void travel() {
        System.out.println("飞机旅行!");
    }
}

public class TrainStrategy implements TravelStrategy {
    @Override
    public void travel() {
        System.out.println("火车旅行!");
    }
}
public class Person {

    private TravelStrategy strategy;
    public void setStrategy(TravelStrategy strategy) {
        this.strategy = strategy;
    }
    public void travel() {
        strategy.travel();
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试踩坑合集

文章目录 前言一、String1、String的常用方法 二、多线程1、有几种线程池 三、集合1、hashmap和hashtable的区别2、红黑树转链表的条件 四、SpringMvc1、springMVC的处理流程 五、Sql1、把班级看做一张表&#xff0c;男女平均年纪和人数总数&#xff0c;根据性别分组2、Mysql事…

Kelvin和Rossby波 Part-1(简要介绍)

Equatorial Kelvin and Rossby Waves 赤道Kelvin和Rossby波&#xff1b;在该部分简要介绍 Kelvin waves和Rossby waves是海洋对西风突发等外界作用力变化的调整方式。这种调整是通过受重力、科氏力f以及科氏力的南北变化 ∂ f / ∂ y β \partial f/\partial yβ ∂f/∂yβ影响…

品优购项目06课后作业--产品详情页,text-align:justify属性无效,

文章目录 0.编程中出现的问题0.1 html文字字数不一致的布局方法&#xff0c;也就是如何实现文字俩端对齐&#xff1f;0.2 text-align:justify;属性无效怎么办&#xff1f; 1.结构分析1.1 快捷导航栏header头部模块nav导航模块1.2 主产品模块1.3 产品详情模块 2.代码部分2.1 主产…

消息中间件——RocketMQ(与Kafka、RabbitMQ的对比)

RocketMQ、Kafka、RabbitMQ的对比 1.ActiveMQ:Apache出品的比较老的消息中间件 2.Kafka:支持日志消息,监控数据,是一种高吞吐量的分布式发布订阅消息系统,支持百万级别的单机吞吐量,但是可能会造成数据丢失 3.RocketMQ:阿里在使用Kafka之后发现了它的消息系统主要定位于日志传…

springboot+jsp+java流浪动物猫狗领养救助网站367hp

本流浪猫狗领养救助网站共包含14个表:分别是宠物类型信息表&#xff0c;配置文件信息表&#xff0c;流浪宠物评论表信息表&#xff0c;活动类型信息表&#xff0c;领养宠物信息表&#xff0c;领养中心信息表&#xff0c;流浪宠物信息表&#xff0c;宠物知识信息表&#xff0c;收…

高压功率放大器在木结构的螺栓连接松动检测系统中的应用

实验名称&#xff1a;功率放大器在面向木结构的螺栓连接松动检测系统中的应用 实验设备&#xff1a; 计算机、压电传感器PZT、D型数显扭矩扳手、NIELVISII&#xff0b;数据采集卡、ATA-2021H功率放大器等。 实验过程&#xff1a; 设计了一种基于压电时间反演法的木材连接螺栓松…

2023年认证杯SPSSPRO杯数学建模C题(第一阶段)心脏危险事件全过程文档及程序

2023年认证杯SPSSPRO杯数学建模 C题 心脏危险事件 原题再现&#xff1a; 心脏的每一次搏动都伴随着心脏的电生理活动。心脏的起博点通过放电&#xff0c;使电流传导到每个心肌纤维&#xff0c;接收到电信号后&#xff0c;相应的心肌纤维完成一次收缩&#xff0c;心脏也就随之…

SpringBoot【开发实用篇】---- 整合第三方技术(监控)

SpringBoot【开发实用篇】---- 整合第三方技术&#xff08;监控&#xff09; 1. 监控的意义2. 可视化监控平台3. 监控原理 在说监控之前&#xff0c;需要回顾一下软件业的发展史。最早的软件完成一些非常简单的功能&#xff0c;代码不多&#xff0c;错误也少。随着软件功能的逐…

在Window10和Window11系统,WPF使用Viewport3D 渲染失败问题解决方案

最近遇到个棘手的问题&#xff1a;在供应商提供的戴尔optiplex 3000的12代处理器主机的集成显卡Intel(R) UHD Graphics 770上使用Viewport3D 渲染失败&#xff08;3D模型显示不了&#xff0c;或者是显示不全&#xff09;&#xff0c;之前开发验证使用的是集成显卡Intel(R) UHD …

【FOSS】新一代绿色节能对象存储

01 背景概述 2020年9月中国明确了“碳达峰、碳中和”目标&#xff0c;2021年&#xff0c;碳达峰、碳中和被首次写入政府工作报告。该事件标志着中国对促进经济高质量发展&#xff0c;社会繁荣和生态环境保护的决心。 据IDC白皮书预测&#xff0c;中国将在2025年成为全球最大数…

团队数千人,苹果XR头显核心高管大曝光

上周&#xff0c;彭博社Mark Gurman从参与研发的相关人士了解到的消息&#xff0c;阐述了苹果XR头显开发简史。本周&#xff0c;继续公布了参与到苹果XR头显研发工作的一些关键岗位或高管人士。相关阅读&#xff1a;《苹果XR头显简史&#xff1a;现实困境与未来预期》 Mark Gu…

Flutter Overlay 你用上了么

Flutter Overlay 你用上了么 前言 Flutter中的Overlay是一个用于在屏幕上显示浮层的组件。它可以用来在应用程序中创建弹出窗口、提示框、菜单、对话框等等。 Overlay通常用于在用户与应用程序交互时显示临时性的UI元素&#xff0c;例如&#xff1a;用户点击按钮时显示下拉菜单…

3dMax一键窗户可入库插件使用方法详解

3dMax一键窗户(可入库)插件使用教程 3dMax一键窗户(可入库)插件,支持在选中的多边形上创建窗户模型,并可以自定义窗户形状,保存到库里下次使用。 【安装方法】 1.复制“窗户样本”文件夹到D盘根目录(D:\窗户样本) 2.拖动插件脚本到3dmax视口中打开即可。 【创建窗户】…

SolidWorks装配体中让弹簧随装配体运动的方法

弹簧是我们日常设计中最常用的几种零部件之一&#xff0c;但是弹簧不跟螺栓一样装好之后是相对静止的&#xff0c;弹簧在装配好后需要进行运动&#xff0c;在SolidWorks装配体中可以让弹簧跟随其他物体运动&#xff0c;操作分为三大步&#xff1a; 一、创建弹簧&#xff08;使…

微服务: Seata AT 分布式事务配置出现异常解决(相当全面)(下篇)

目录 1. 文章传送门 -> 上篇传送门: 微服务: Seata AT 分布式事务以及配置方式(上篇) -> 中篇传送门: 微服务: Seata AT springCloud整合分布式事务以配置方式(中篇) 2. 异常总结分类: 3. 解决上述问题: -> 解决上述问题一: 1. no available service null f…

面了一个测试工程师要求月薪23K,总感觉他藏了很多面试题...

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

七人拼团系统开发模式,如何做到短短几个月就销售额上亿?

随着经济的迅速发展&#xff0c;市场上的商业模式也是层出不穷&#xff0c;而且各具特色&#xff0c;看得人眼花缭乱。最近又新出了一个七人拼团商业模式&#xff0c;不仅能够助力企业快速裂变获客&#xff0c;还能迅速提升产品销量&#xff0c;达到短短几个月就销售额上亿的“…

MariaDB 主从同步配置

1 服务器结构 角色ip地址安装教程主节点192.168.31.102CentOS-7 安装 MariaDB-10.8从节点192.168.31.103 2 原理&#xff1a; 原理&#xff1a; &#xff08;1&#xff09;master服务器将数据的改变记录到二进制binlog日志&#xff0c;当master上的数据发生改变时&#xff0c…

【连续介质力学】张量场

张量场 张量场表示张量 T ( x ⃗ , t ) T(\vec x, t) T(x ,t)在空间 x ⃗ \vec x x 和时间 t t t中如何变化&#xff0c;将张量场视为可微函数 如果一个张量场不依赖于时间&#xff0c;则此张量场称为定常场&#xff0c;例如 T T ( x ⃗ ) T T(\vec x) TT(x )&#xff1b;相…

如此优秀的低代码平台,佬们一起来体验一把!

前言&#xff1a;低代码平台是一种新兴的应用开发技术&#xff0c;将可视化建模、自动生成代码和开发者编写的代码结合在一起&#xff0c;使应用程序的开发变得更加快速、简单且高效。低代码平台的基本思想是通过消除繁琐的手动编码工作&#xff0c;来让开发者更好地专注于业务…