软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

news2024/9/29 11:36:35

目录

掌握的知识点

创建型

结构型

行为型


掌握的知识点

  • 设计模式分为哪3类

 

  • 每一类包含哪些具体的设计模式

创建型

创建型模式是对对象实例化过程的抽象,他通过抽象类所定义的接口,封装了系统中对象如何创建、组合等信息

 

创建型模式主要用于创建对象,做到了软件模块跟对象的创建无关联

包括的设计模式有:

  • 抽象工厂模式
  • 建造者模式
  • 工厂方法模式
  • 原型模式
  • 单例模式

结构型

结构型模式主要用于如何组装已有的类和对象,已获得更大的结构,一般借鉴封装、代理、继承等概念讲一个或者多个类进行组合、封装,已提供统一的外部视图或新的功能。

 

主要负责处理类或对象之间的关系,将类和对象进行有效组织,形成良好的体系结构

主要的模式包括:

  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰器模式
  • 外观模式
  • 享元模式
  • 代理模式

行为型

该模式主要用于对象之间的职责以及提供的服务的分配,不仅描述对象或类的模式,还描述他们之间的通信模式,特别是描述一组对等的对象怎样相互协作以完成其中任一对象都无法单独完成的任务。

 

主要处理类和对象之间的交互方式,以及如何为类和对象分配职责进行描述

主要的模式包括:

  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介者模式
  • 备忘录模式
  • 观察者模式
  • 状态模式
  • 策略模式
  • 模板方法模式
  • 访问者模式

例子:

由于传统的结构化的软件设计方法不符合面向对象的设计原则,无法很好地实现高内聚低耦合的要求,模块之间过于紧密,给软件扩展和维护带来很多困难,这种情况下设计模式的出现和广泛应用给问题的解决提供了一种有效的方法,通过利用设计模式,可帮助开发者利用已有的设计方法,设计出结构合理、易于复用和可维护的软件,当用户需求发生改变时,可通过修改少量代码或不修改原有代码即可满足新的需求,增强了系统的可修改性和稳定性,降低系统开发成本。

strategy,属行为型,定义一系列算法,把它们一个个封装起来,并且使它们之间可互相替换,从而让算法可独立于使用它的用户而变化。在监控模块的告警功能上,我们监控的各软件的前端界面上可由用户配置接收告警信息的方式,例如默认钉钉另有短信、微信、电话语音,定时任务在监控到有异常且满足发告警的情况下,后端代码会获取到用户配置的信息,根据配置信息调用指定的策略发送告警信息,具体实现是,先抽象出基类class AlarmSender,子类扩展基类class DingSender(AlarmSender)、class SMSSender(AlarmSender)等,并在子类中定义具体实现def send(self, info),假设当前有RabbitMQ告警且用户配置的是默认钉钉方式,则在发告警时的代码为先实例化mq_ins = MQInfo(info='告警内容', way=[DingSender]),way为具体的发告警的方式,再调用mq_ins.way.send(info)完成发送告警。使用这种模式我们发现,发告警的方式(即算法)可自由切换,将发告警的类名作为参数传入即可,这也是依赖抽象类设计接口的好处之一,还减少代码冗余,扩展性好,移植方便,使用灵活。

例子2:

策略模式:

在系统中,设计到住户缴费的功能,目前的线上缴费渠道有多种,如微信,支付宝,银联支付等多种。各个支付渠道的算法又不相同,起初我们用多重条件判断,涉及各个渠道支付实现的算法又包含重条件判断,这样定义后,发现代码不够简洁,也不利于维护,经过分析后,我们选择采用策略模式,首先定义了一个paystrategy接口作为抽象角色,然后定义了如alipaystrategy,wechatpaystrategy,unicompaystrategy具体角色,这些具体实现类里封装了对于支付方式的算法,并且这些类实现paystrategy了接口。定义了paycontextstartegy,该类引用了paystrateg.当web请求支付,并且带有支付方式的pay_code; controller接到请求后,使用paycontextstartegy调用具体的支付类如alipaystategy,wechatpaystategy,uniompaystrategy.通过使用策略模式,我们实现了不同方式的支付自由切换,避免了多次条件判断,利用组合代替继承,将算法的选择和算法的实现分开,降低了程序间的耦合度,具有很好的扩展型和可维护型。

例子3:

责任链模式:责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

测试平台: 

请求---拼装公共参数(环境信息,公共配置)----替换个性化参数---替换上下文参数

 参考:责任链设计模式(职责链模式)

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

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

相关文章

【物联网】微信小程序接入阿里云物联网平台

微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例,之前没有的点进去申请 2.点击产品,创建产品 3.产品名称自定义,按项目选择类型,节点类型选择之恋设备,联网方式W…

Linux下安装Redis的详细安装步骤

一.Redis安装 1.下载linux压缩包 【redis-5.0.5.tar.gz】 2.通过FlashFXP把压缩包传送到服务器 3.解压缩 tar -zxvf redis-5.0.5.tar.gz4.进入redis-5.0.5可以看到redis的配置文件redis.conf 5.基本的环境安装 使用gcc -v 命令查看gcc版本已经是4.8.5了,于是就…

ubuntu系统突然失去网络问题

修复ubuntu系统网络问题 1. 服务不存在?2. 修改配置,自动启动网络 每天都在用的ubuntu系统突然ssh连接不上,进系统ifconfig也不显示ip。当然也ping不通任何网页。 1. 服务不存在? 初步怀疑网络服务被关闭了,需要修改配…

【C6】数据类型/移植/对齐,内核中断,通过IO内存访问外设,PCI

文章目录 1.内核基础数据类型/移植性/数据对齐:页大小为PAGE_SIZE,不要假设4K,保证可移植性1.1 kdatasize.c:不同的架构(x86_64,arm),基础类型大小可能不同,主要区别在long和指针1.2…

chatgpt赋能python:用Python访问数据库的SEO文章

用Python访问数据库的SEO文章 在当今互联网飞速发展的时代,数据处理和数据库技术的重要性不言而喻。在这些应用中,Python是使用最广泛和最受欢迎的编程语言之一。Python的简单和易学性使其成为理想的选项,可以通过Python来访问各种类型的数据…

荣耀90推出最新MagicOS7.1更新,增加控制中心功能

荣耀 90 系列机型推出了最新的 Magic OS 7.1更新,版本号为7.1.0.137 (C00E130R2P2)。该更新主要增加了控制中心功能,并对部分场景拍摄效果进行了优化。此外,该更新还提升了系统与部分三方应用的兼容性,以提高系统性能和稳定性。 …

选择最适合您自动化系统的控制方式

自动化系统可采用多种不同的控制方式,其中硬件控制和PLC(可编程逻辑控制器)是常见的选择。 刚好,我这里有上位机入门,学习线路图,各种项目,需要留个6。 硬件控制通常指使用专用硬件电路实现控…

C++3(sizeof和逗号运算符,类型转换)

1.sizeof的用法 逗号运算符 口诀:从左到右算,返回最右边的值 类型转换 如何实现的隐式类型转换? 先算右边的,右边的3(int)先提升为double ,然后算得(7.541(double&#…

CMU 15-445 -- 关系型数据库重点概念回顾 - 01

CMU 15-445 -- 关系型数据库重点概念回顾 - 01 引言Relational Data ModelDBMS数据模型Relational ModelRelation & TuplePrimary KeysForeign Keys Data Manipulation Languages (DML)Relational Algebra Advanced SQLSQL 的历史SQLAggregatesGroup ByHavingOutput Redire…

内存屏障类型表

load store 啥意思 内存屏障类型表 StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障(其他类型的屏障不一定被所有处理器支持)。执行该屏障开销会很昂贵,因为当前处理器通常…

在文件每行开头或结尾插入指定字符

1、在文件每行插入指定字符 sed -i "s/^/curl /g" missing.txt效果 2、在每行末尾插入指定字符 sed -i "s/$/结束 /g" missing.txt

leetcode1856. 子数组最小乘积的最大值(单调栈-java)

子数组最小乘积的最大值 leetcode1856.子数组最小乘积的最大值题目描述解题思路代码演示: 经典算法集锦 leetcode1856.子数组最小乘积的最大值 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/maximum-subarr…

【网络安全】初探SQL注入漏洞

如何利用SQL注入漏洞获取用户密码 前言1. 设计思路2. 设计目的 一、网站快速搭建1. 登录页2. 注册页3. 数据库连接页4. 首页(登录后跳转到此处)5. session页6. 注销页7. 查询页8. 数据库 二、SQL注入实例(小试牛刀)1. 猜测漏洞逻辑…

tomcat部署以及优化

目录 1.三个核心组件 2.tomcat服务部署 3.虚拟主机配置 4.tomcat优化 5.部署两台tomcat服务器 6.总结 1.三个核心组件 web容器 完成web服务 servlet容器 名为catalina 用于处理servlet JSP容器 将JSP动态网页翻译成…

网络通信之旅:揭秘交换机、路由器与网关的神奇世界!

文章目录 一 交换机2.1 交换机初识2.2 MAC地址表2.3 数据包2.4 交换机与数据包2.5 泛洪2.6 结论:交换机—二层设备 三 路由器3.1 WAN口&LAN口3.2 路由器-WAN交换机 四 网关4.1 子网划分4.2 网关4.3 路由 五 实践:路由器桥接-搭建主副路由器5.1 知识探…

动态规划:

这类问题非常简单&#xff0c;甚至看起来有点笨&#xff0c;说白了就是利用计算机的计算能力一步步算过去&#xff0c;也就是大多数人没有意识到的递推问题 比如求1~n的前缀和&#xff1a; #include<iostream> using namespace std; long long sum[100]; int main(){in…

20kV高精度可调高压稳压测试电源的学习与使用

一&#xff1a;应用范围 A: 二极管反向耐压测试 B: 二极管反向漏电流测试 C: 高压电容耐压测试 D: 玻璃釉电阻非线性性能测试 E:氙灯击穿电压测试 F: 材料耐压测试 二、特点 高精度恒流恒压高压输出源 它拥有0~20kV的电压输出能力, 0.005%的电压分辨率精度, 0.1uA的电 …

Docker安装Prometheus和Grafana监控Redis

Docker安装Prometheus和Grafana监控Redis 使用 Docker 安装 Grafana 和 Prometheus 无疑是最简单的&#xff0c;我们接下来将采用此种方式。 1、安装Prometheus 查看Prometheus镜像 $ docker search prometheus拉取镜像 $ docker search bitnami/prometheus在/home/zhangs…

css 小程序 按钮控件点击区域放大 热点区域

背景&#xff1a; 小程序在手机上屏幕过小&#xff0c;但是又想放很多元素&#xff0c;这时候点击区域&#xff0c;命中元素概率很&#xff0c;希望能在不布局不变形情况下&#xff0c;把点击区域放大。 先看效果&#xff1a; 解决方法&#xff1a; 通过&#xff1a;transfo…

WebGL交错缓冲区【Interleaved Buffer】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 昨天我在 WebGL 沙箱项目的评论中收到 Jon 的一个问题&#xff1a; 嗨, 布兰登&#xff0c;以你的演示为起点&#xff0c;我尝试显示一个金字塔&#xff0c;但到目前为止我只能看到它的四个面之一。 如果我使用 gl.LINES…