Datawhale 202212 设计模式 | 第二章 23种设计模式

news2024/11/25 13:29:34

23种设计模式讲解

  • 策略模式
    • 问题:
    • 解决方案:
    • 效果:
      • 适用场景:
      • 实际应用:
      • 优点缺点:
    • 实例:
  • 装饰 6
    • 问题:
    • 解决方案:
    • 效果:
  • 代理 7
    • 问题:
    • 解决方案:
    • 效果:
  • 参考文献:

设计模式有四个基本要素:

  • 模式名称(pattern name):一个助记名,它用一两个词来描述模式的问题、解决方案和效果。
  • 问题(problem):描述了应该在何时使用模式。
  • 解决方案(solution):描述了设计的组成成分,它们之间的相关关系以及各自的职责和协作方案。
  • 效果(consequences):描述了模式应用的效果以及使用模式应该权衡的问题。

设计模式总体分为三大类

  • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

策略模式

策略模式(Strategy Pattern)是指定义一个算法家族,使得家族内的不同算法都遵从算法家族的接口及方法规范,从而可以实现算法间互相替换,且不会影响到使用算法的客户。

问题:

一个系统中有多个算法和类很相似,区分这些类和算法的只是其内部行为。

解决方案:

策略模式由三类主要角色组成:

  • 策略类:定义所有支持算法的公共接口,在这个例子中具体为收费抽象类;
  • 具体策略类:具体的算法,在这个例子中具体为各类收费类和折扣优惠收费类;
  • 上下文类:维护对策略对象的应用。
    策略结构的通用示意图

效果:

适用场景:

一个系统中有多个算法和类很相似,区分这些类和算法的只是其内部行为。

实际应用:

在导航应用中,有不同的路径规划算法,如针对步行的、骑行的、搭乘公共交通工具的、以及开车的等。主要导航类的主要工作是在地图上渲染出规划好的路径,并不会在意是由和算法生成的路径。此时可以将路径规划算法使用策略模式进行封装,方便与主要导航类的交互。

优点缺点:

优点

  • 可以以相同的方式调用所有算法,减少了各种算法类与使用算法类之间的耦合。策略模式的Strategy类层次为Context类定义了一系列的可供重复使用的算法或行为,继承有助于析取这些算法中的公共功能。
  • 简化了单元测试。每个算法都有自己的类,可以通过自己的接口单独测试;
  • 符合“开放封闭原则”,无需对上下文进行修改就可以引入新的策略。

缺点

  • 不适合算法极少发生改变的场景,会使得程序整体过于复杂;
  • 要求客户端必须知晓策略间的不同,因为需要从中选择;

实例:

要求实现一个商场收银软件程序,营业员可以通过输入客户所有购买商品的单价和数量,程序自动计算出总金额。同时满足:

  • 商场有时会有打折活动(如商品打7折),
  • 满减促销活动(如商品满300-100),

程序应能考虑这些活动的情形,在尽量减少重复代码的前提下,实现正确的金额计算。

使用策略模式来解决问题

  • 首先创建抽象的算法类CashSupur,作为所有促销活动算法的抽象类,同时定义所有支持算法的公共接口,定义方法acceptCash()用于得到结果;
  • 创建具体的促销算法类CashNormal,CashRebate等,继承于抽象算法类CashSupur,覆写acceptCash()实现具体的促销算法;
  • 创建上下文类CashContext,维护对算法对象的引用,使用时根据用户输入,传入一个具体的促销算法类来配置。
    结构示意图
# 策略模式: 设计一个 已知单价和数量 的总价单价计算器

## 现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价
class CashSuper(object):
    def __init__(self):
        pass
    
    def AcceptCash(self, money):
        pass
    
    
## 正常收费子类
class CashNormal(object):
    def AcceptCash(self, money):
        return money

    
## 打折收费
class CashRebate(CashSuper):
    __moneyRebate = 1
    def CashRebate(self, moneyRebateStr):
        self.__moneyRebate = float(moneyRebateStr)
    def AcceptCash(self, money):
        return money * self.__moneyRebate


## 返现收费
class CashReturn(CashSuper):
    __moneyCondition = 0
    __moneyReturn = 0
    def cash_return(self,moneyConditionStr,moneyReturnStr):
        self.__moneyCondition = float(moneyConditionStr)
        self.__moneyReturn = float(moneyReturnStr)
    def accept_cash(self,money):
        result = money
        if (money >= self.__moneyCondition):
            result = money - money // self.__moneyCondition * self.__moneyReturn
        return result

装饰 6

问题:

描述了应该在何时使用模式。

解决方案:

描述了设计的组成成分,它们之间的相关关系以及各自的职责和协作方案。

效果:

描述了模式应用的效果以及使用模式应该权衡的问题。

代理 7

问题:

描述了应该在何时使用模式。

解决方案:

描述了设计的组成成分,它们之间的相关关系以及各自的职责和协作方案。

效果:

描述了模式应用的效果以及使用模式应该权衡的问题。

参考文献:

CSDN - 23种设计模式

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

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

相关文章

(附源码)springboot球鞋文化交流论坛 毕业设计 141436

目 录 摘要 1 1 绪论 1 1.1 研究意义 1 1.2研究方法 1 1.3论文结构与章节安排 1 2 球鞋文化交流论坛分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据增加流程 3 2.3.2数据修改流程 4 2.3. 数据删除流程 4 2.3 系统功能分析 4 2.3.1 功能性分析 4 2.3.2 非功能性分析 5 …

【MySQL】说透锁机制(二)行锁 加锁规则 之 范围查询(你知道会锁表吗?)

本文会按照 聚集集索->唯一索引->普通索引 的顺序 地毯式分析 范围查询中 <、<、>、> 的行锁情况&#xff0c;锁表分析在唯一索引 章节&#xff0c;万字长文&#xff0c;力求分析全面&#xff0c;很硬核全网独一份&#xff0c;别忘了收藏&#xff01; 当然如…

中学课程辅导杂志中学课程辅导杂志社中学课程辅导编辑部2022年第34期目录

教育视点《中学课程辅导》投稿&#xff1a;cn7kantougao163.com 基于整体英语教学理念的初中英语读写课研究 徐杰; 3-5 初中语文阅读教学的有效追问策略 徐生; 6-8 初中音乐教学中融入美育的实践探讨 张静; 9-11 “让学引思”理念下的初中物理高效课堂构建 张敏…

部署Neo4j +Rasa+Rasa UI

一、前言 最近在学习kbqa&#xff0c;调研时发现gitee上有关于多轮对话系统源码&#xff0c;该仓库主要是基于rasa框架&#xff08;python语言&#xff09;实现&#xff0c;并且带有web的UI配置&#xff0c;相当于比较全面的对话平台。Rasa UI 可以基于客户已有的平台&#xf…

西电雨课堂测试大合集【导航】

文章目录基础写作 一、二科学道德与学风研究生的压力与心理健康学术规范与论文写作中国传统文化✨感谢各位博主的分享&#xff01; &#x1f4d2;我在这里只是进行了一些整理&#xff0c;方便大家查找。 ⚠️大家看完可以给博主们点点赞、收藏、关注。&#x1f601; 祝各位学业…

Linux机器安装Nginx配置并实现双向认证

Linux机器安装Nginx配置并实现双向认证 一.Nginx的安装配置 Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的…

TiDB | TiDB在5A级物流企业核心系统的应用与实践

TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最后前言 历经了近半年的测试验证和迁移准备&#xff0c;神州金库3.0核心系统 WMS 正式从 MyS…

力扣(LeetCode)152. 乘积最大子数组(C++)

序列dp f[i]f[i]f[i] 表示以 iii 结尾的连续子数组的最大乘积&#xff0c;d[i]d[i]d[i] 表示以 iii 结尾的连续子数组的最小乘积 。 如果只有正数&#xff0c;我们只需要考虑最大乘积 f[i]f[i]f[i] &#xff1b;有负数&#xff0c;需要考虑与负数相乘的数&#xff0c;越小越好…

【unity】基础交互入门(碰撞交互事件OnTriggerEnter和OnCollisionEnter)

一、碰撞交互事件OnTriggerEnter 1、在场景中添加两个几何体&#xff08;例如Cube和Sphere&#xff09; 2、添加Rigidbody&#xff08;刚体&#xff09;component 点击Cube&#xff08;正方体&#xff09;对象&#xff0c;在面板找到这个按钮&#xff0c;添加component 搜索…

Zabbix6.0使用教程 (五)—zabbix从二进制包安装上篇

大家好&#xff0c;我是乐乐。上一期我们已经讲过从源代码安装zabbix&#xff0c;本期着重讲从二进制包安装zabbix。 当我们在ZABBIX官方存储库可以看到&#xff0c;Zabbix SIA 提供如下官方RPM和DEB包&#xff1a; Red Hat Enterprise Linux/CentOS Debian/Ubuntu/Raspbian …

即时通讯音视频开发编码H.264的特点与优势

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 国际上制定视频编解码技术的组织有两个&#xff0c;一…

[附源码]Python计算机毕业设计SSM基于Java的运动健身平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

博客网页设计制作 简单静态HTML网页作品 DIV CSS个人网页作业成品 dreamweaver学生个人博客网站模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Mentor-dft 学习笔记 day42-ASCII File Format(2)

FORCE “primary_input_pin” <value> <time>; 此命令用于在给定时间强制选定主输入引脚上的值&#xff08;0,1、X或Z&#xff09;。时间值不得低于该程序的先前时间值。每个程序的时间在时间0再次开始。主输入引脚将用双引号括起来。APPLY “scan_group_procedure…

高通Ride软件开发包使用指南(10)

高通Ride软件开发包使用指南&#xff08;10&#xff09;7 平台管理任务7.1 连接到控制台7.1.1 串口连接SOC1和SOC27.1.2 识别 SOC1 或 SOC 27.1.3 识别平台构建7.1.4 串口连接SA9000P7.1.5 通过串口连接到 Aurix7.2 在 SIP1 和 SIP2 上为 SA8xxxP 分配 IP 地址7.2.1 分配静态 I…

【数据预处理机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究

文章目录一.需求背景二. 任务开始2.1 薪酬的中位数、均值和众数和数据倾斜模块详细设计2.2 按不同的类别划分职位中的薪酬数据&#xff0c;画盒图/箱线图&#xff0c;检查孤立点/离群点一.需求背景 课题中心&#xff1a;招聘网站的职位招聘数据预处理 之前的文章&#xff0c;…

【JAVA】final关键字

&#x1f3c6;今日学习目标&#xff1a;final关键字 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰本期期数&#xff1a;第一期 &#x1f389;专栏系列&#xff1a;JAVA 文章目录前言final关键字final关键字修饰类示例&#xff1a;fin…

[附源码]Python计算机毕业设计高校社团管理平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

笔试强训(四十五)

目录一、选择题二、编程题2.1 查找兄弟单词2.1.1 题目2.1.2 题解一、选择题 &#xff08;1&#xff09;IP数据报分片的重组通常发生在&#xff08;D&#xff09; A.源主机和数据经过的路由器上 B.源主机上 C.数据报经过的路由器上 D.目的主机上 数据分片是网络层发现上层给的数…

Java反射(通俗易懂!)

文章目录2.反射2.1反射的概述2.2 获取 Class类对象的三种方式2.3反射获取构造方法并使用2.3.1Class 类获取构造方法对象的方法2.3.2Constructor类用于创建对象的方法2.3.3小结2.4反射获取成员变量并使用2.4.1Class类获取成员变量对象的方法2.4.2Field类用于给成员变量赋值的方法…