EBU6304 Software Engineering 知识点总结_6 项目管理_下 Design Patterns

news2024/9/17 7:09:03

Design Patterns

Decorator Design pattern

用于扩展系统功能的装饰模式。

比如我们有一个鸭子类,可以调用其鸭子叫的方法。我们初始化了一个鸭子对象,如何统计这个对象叫了几次,也就是其鸭子叫方法被调用了几次?记住OCP原则不允许我们直接修改鸭子类。

我们可以用一个计数类来把鸭子类包住。

image-20230605183433552

装饰模式实现一个接口,接口中的方法通过该变量的同一个参数去调用同一个方法,比如本例中是鸭子呱呱的计数,每次调用++。

Adapter design patterns

1685983233527

1685983255642

这个例子包括了几个原则:

  1. 首先不同接口功能尽量分开,ISP,也就是说鸭子叫和计数不要写一个方法里。
  2. 不能直接修改类,OCP。
  3. 如果想鸭子叫同时计数,直接调用包装类即可,DRY。
  4. GooseAdapter 只访问了 Goose 的 honk 方法而不是对其完全访问,DIP。这里如果改成继承的子类,就有全部访问权了。

Wrapper design patterns

Wrapper 模式包括 decorator 和 adapter。decorator 主要是外面的包裹类和里面的类都实现一个接口,比如上例的鸭子嘎嘎。adapter 是内部类不需实现。

Immutable View:前面提过java引用的问题,比如两个变量引用同一个对象,一改都改。这样就相当于有引用的时候,该目标对象完全暴露出来了。在wrapper里我们可以限制包装类:禁止修改对象,修改则抛出异常。

1685986070602

Composite Design Pattern

包装了一个集合。

1685985869548

Observer Pattern

比如看到绿灯汽车知道该走了,这种观察者一个变量改变影响其他变量的实现。

java是提供了observable的api的,当对应变量值改变时触发函数。

1685986641156

1685986768769

1685986796502

不过这种写法违反了OCP,因为我们修改了dogbot让他主动实现observer的update。我们可以采用decorator design 方法。

1685989787205

如果dogbots是一个接口,dogwatcher 可以实现计数功能,还可以在文件,在gui中实现dogbots,实现集合的dogbots,两者代码几乎是分离的。

我们先用一个ObservableDogBot类继承Observable,且实现未完成的dogbots,然后写一个dogreporter实现observer。最后rover.addObserver(reporter1);

Factory Methods

如果我们设定饥饿值大于6的狗要被构造为greedyDogBot是普通狗的子类,那么PlainDogBot和greedyDogBot都直接提供出来构造方法不太好。可以通过一个构造类来判断需要返回什么对象。

image-20230606123312445

这个构造方法可以返回接口类,但是实际方法里返回的都是实现了接口类的具体类,这样可以隐藏返回类类型:

1686026157643

工厂类甚至自己可以包装好类然后送回来一个包装类:

1686026296136

当然工厂方法除了静态的,也可以是非静态的工厂对象。我们可以利用不同的工厂对象包装不同的包装类,这样还能进一步隐藏返回对象的一些信息。

比如下一个例子中,spy狗多一个watcher。我们用多态方法初始化两个 Dog Factory,但是一个是实际SpyDogFactory类型的,一个实际是PlainDogFactory类型的,因此两者调用makeDogBot的时候会返回不同的狗。

1686026555327

像计数等额外包装功能,我们也可以不用“先用一个计数类包装普通类,再用工厂类包装计数类”,而是把计数内容包装在工厂类里。

1686026955303

1686026838784

Singleton Design Pattern

构造方法不一定返回必须是新创建的对象,工厂类里可以返回已有的对象。

1686027588395

注意LSP原则。

Object Pool Design Pattern

对象池模式,保留一个对象列表,在需要的时候返回一个特定对象。

Strategy Design Pattern

选择要执行的策略。

1686027938500

上图是狗执行几次action的函数。我们也可以利用重写的Comparator实现条件结构,比如比较ab两狗叫了几次,叫的少的补差。

State Design Pattern

可以改变对象的状态类型。

下面改变的几个类型都是accountState抽象类的实现类,通过多态的方式初始化。

image-20230606180142747

Bridge Design Pattern

解耦思想。比如我们需要12种颜色的画笔,可以选择12根固定颜色的蜡笔,或者1根毛笔和12种颜料。毛笔的例子就很好地解耦了画笔和颜色。

例子来源:处理多维度变化——桥接模式(一)_LoveLion的博客-CSDN博客

下例:求父子交集。

image-20230606181219816

Flyweight Pattern

将那些大量的,具有很多内部状态而外部状态很少的对象进行共享,可以以类似缓存的方式共享。

概念来源:精读《设计模式 - Flyweight 享元模式》 - 知乎 (zhihu.com)

image-20230606181617881

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

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

相关文章

mysql 在 linux下的安装 和 配置

文章目录 1. linux 安装mysql1. 源码安装1.找到源码包2: 进行配置3:初始化数据目录官方说明 自用4:启动数据库5:写入环境变量 2:使用yum安装1. 直接配置mysql仓库 或者下载MySQL Yum Repository2:安装启动进入mysql 3&…

整理推荐 6 个超好用的平面设计网站!

本文将为大家介绍了 6 个最佳学习平面设计的网站,包括即时设计、Behance、Awwwards、Dribbble、Designinspiration 和 Pinterest。选择学习平面设计网站需要考虑匹配自己的设计风格、是否具有局限性等,可以试用几个网站后选择最合适的。 1、即时设计 即…

我们投出去的简历为什么已读不回?来看面试官如何筛选简历、挑选求职者?

目录 前言: 应届生 1、看学历 2、看实习经历 3、看专业 职场人士 面试官喜欢问什么问题 总结 前言: 金三银四,是求职者蠢蠢欲动的季节,亦是企业摩拳擦掌的季节。 因为作为企业的一名金牌面试官,我收到的内推…

RK1126 C++ yolov5 6.2

基于 rk npu , 实现 yolov5 6.2 模型推理 实现过程 ⚡️​ 编译 opencv 需根据自己路径修改. cmake -D CMAKE_BUILD_TYPERELEASE \-D CMAKE_C_COMPILER./gcc-arm-8.3-2019.02-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \-D CMAKE_CXX_COMPILER./gc…

【Linux】多线程02 --- 线程的同步互斥问题及生产消费模型

🍎作者:阿润菜菜 📖专栏:Linux系统编程 目录 一、线程互斥1. 为什么要有共享资源临界保护? 2.理解加锁2.1 认识锁,使用锁 线程同步互斥问题是指多线程程序中,如何保证共享资源的正确访问和线程间…

阿里P8大佬七天七夜制作这份自动化核心知识点,错过了就是错过了

整理了一份自动化核心知识点。覆盖了web前端基础,HTML标签,CSS样式,自动化测试工具,webdriver环境搭建,元素定位,手机操作系统,移动自动化测试工具,自动化测试的流程与分类&#xff…

web自动化测试入门篇01——框架介绍

1. 目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持&#x…

高完整性系统(7)Formal Verification and Validation

文章目录 Specification Process 规格化过程State Invariants案例check ... expect Alloy是一种用于构建和检查抽象模型的语言和工具。当Alloy说所有断言都成立时,这意味着你的模型或规格在给定范围内已成功通过了所有的断言检查。换句话说,对于你所定义…

SOLIDWORKS PDM 独立程序 C#

本主题介绍如何创建登录到 一个 SOLIDWORKS PDM Professional 文件库,并列出根文件夹中的文件。 启动Visual Studio.文件 > 新建 > 项目 > Visual C# > WPF(也可以使用WF) 输入程序名称选择存储路径确定在解决方案资源管理器中…

(学习日记)2023.06.06

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【Linux】基础文件IO、动静态库的制作和使用

基础IO 前言回顾C语言文件IO操作三个标准 系统文件I/O系统调用接口不带mode的open带mode的openwirtereadopen的第二个参数flagsopen返回值文件的管理0,1,2演示文件描述符的分配规则重定向C中的0、1、2输入重定向追加重定向 另一种重定向的方式dup2实现输…

MySQL5.7主从同步配置(一台master,两台slave)

1. 下载MySQL(5.7.42) rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2.安装 yum install mysql-server2.1 安装过程中如果报错如下,按下边方法处理。否则略过即可 2.2 解决方案:执行以下命令 rpm --import https…

mongodb redis mysql 区别

一、MySQL 关系型数据库。 在不同的引擎上有不同 的存储方式。 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。 开源数据库的份额在不断增加,mysql的份额页在持续增长。 缺点就是在海量数据处理的时候效率会显著变慢。 二、Mo…

Vue3中setup函数、以及父子组件传值讲解

文章目录 1.vue3中setup函数的执行时机2.setup函数的两种写法2.1 普通写法2.2 语法糖写法 3.vue3父组件给子组件传值。4.vue3子组件给父组件传值 1.vue3中setup函数的执行时机 setup选项的写法和执行时机,setup函数在beforeCreate函数之前执行,并且是自…

以安全为底线 共迎机遇和挑战|2023 开放原子全球开源峰会可信基础设施技术分论坛即将启幕

蚂蚁集团的业务领域,对于「可信」有非常高的技术要求。这种可信技术不仅体现在可靠、健壮,也体现在金融领域独有的风控难题以及分布式系统中持续提供服务的续航能力。可信基础设施中有大量的开源项目,而新的机会也在不断涌现。 2023 开放原子…

echarts 图表导出PDF(带滚动条)/图片导出PDF

echarts 图表导出PDF[带滚动条]/图片导出PDF 效果展示提出问题思考问题解决问题导出PDF 里面的页头中文乱码问题参数说明 效果展示 提出问题 在开发过程中,有需求是将展示出来的echarts图表导出为pdf 原本我的滚动条是使用echarts图表进行的滚动,但通过了解后得知,echarts图表如…

《人月神话》阅读推荐

用了两周的时间,大致过了一遍。书中讲述的很多方面可能此时并没有很深刻的体会,但是该书的预见性和分析还是很让人钦佩的。书中对项目、产品、程序、程序员等一系列对象的分析是相当精准的。虽然距今已有四十多年,但很多依旧在发生。   书中…

Java设计模式(四)

系列文章目录 UML类图 文章目录 系列文章目录前言一、UML类图二、UML基本介绍三、UML图1.类图—依赖关系(Dependence)2.类图—泛化关系(generalization)3.类图—实现关系(Implementation)4.类图—关联关系(Association)5.类图—聚合关系(Aggregation)6.类图—组合关系(Composi…

分布式(二)-大型网站架构演化发展历程

大型网站架构演化发展历程 大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简单的业务一旦需要处理数以 P 计的数据和面对数以亿计的用户,问题就会变得很棘手。大型网站架构主要解决这类问题。 初始阶段的网站架构 …

MinIO 分片上传

文章目录 1.MinIO 简介2.为什么要分片上传?3.实现思路4.具体实现初始化客户端获取分片上传的预签名 URL合并分片中止合并 5.FAQ端口错误协议错误 参考文献 1.MinIO 简介 MinIO 是适用于 AI 的高性能对象存储系统。 MinIO 简单易用。简单性是 EB 级数据基础设施的基…