设计模式总览 —— 导论

news2024/10/6 16:23:47

什么是 GOF

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

设计模式的基石

  • 封装
  • 继承
  • 多态
  • 顺序
  • 判断
  • 循环

设计模式总览

  • 创建型模式(Creational Patterns)

    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂方法(FactoryMethod)模式
    • 抽象工厂(AbstractFactory)模式
    • 建造者(Builder)模式
  • 结构型模式(Structural Patterns)

    • 代理(Proxy)模式
    • 适配器(Adapter)模式
    • 桥接(Bridge)模式
    • 装饰(Decorator)模式
    • 外观(Facade)模式
    • 享元(Flyweight)模式
    • 组合(Composite)模式
    • 过滤器模式(Filter Pattern)
  • 行为型模式(Behavioral Patterns)

    • 模板方法(Template Method)模式
    • 策略(Strategy)模式
    • 命令(Command)模式
    • 职责链(Chain of Responsibility)模式
    • 状态(State)模式
    • 观察者(Observer)模式
    • 中介者(Mediator)模式
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 备忘录(Memento)模式
    • 解释器(Interpreter)模式
      在这里插入图片描述

设计的7大原则

  • 开闭原则(Open Closed Principle,OCP)

    • 软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification)
    • 合成复用原则、里氏替换原则相辅相成,都是开闭原则的具体实现规范
    • 扩展新类而不是修改旧类
  • 里氏替换原则(Liskov Substitution Principle,LSP)

    • 继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)
    • 继承父类而不去改变父类
  • 依赖倒置原则(Dependence Inversion Principle,DIP)

    • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)
    • 面向接口编程,而不是面向实现类
  • 单一职责原则(Single Responsibility Principle,SRP)

    • 一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)
    • 每个类只负责自己的事情,而不是变成万能
  • 接口隔离原则(Interface Segregation Principle,ISP)

    • 一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。
    • 各个类建立自己的专用接口,而不是建立万能接口
  • 迪米特法则(Law of Demeter,LoD)

    • 最少知识原则(Least Knowledge Principle,LKP)
    • 只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)
    • 无需直接交互的两个类,如果需要交互,使用中间者
    • 过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低
  • 合成复用原则(Composite Reuse Principle,CRP)

    • 又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)
    • 软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
    • 组合:把要引用的对象放在类里面当成属性。
    • 优先组合,其次继承

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

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

相关文章

mysql免安装版本(简化版)

1:解压mysql-5.7.26-winx64 2:添加data文件夹 3:添加my.ini文件 内容如下: port "3306" # 设置mysql的安装目录 basedir "D://tools\mysql-5.7.26-winx64\mysql-5.7.26-winx64\" # 设置mysql数据库的数…

推荐几个可以免费使用的ChatGPT工具

在ChatGPT相关API推出之后,各种工具如雨后春笋一般层出不穷,这篇文章就列举一些日常使用到的工具。 工具列表 OpenAI 在线读取任意网页内容包括视频(YouTube),并根据这些内容回答你提出的相关问题或总结相关内容支持…

RabbitMq-接收消息+redis消费者重复接收

在接触RammitMQ时,好多文章都说在配置中设置属性 # rabbitmq 配置 rabbitmq:host: xxx.xxx.xxx.xxxport: xxxxusername: xxxpassword: xxxxxx## 生产端配置# 开启发布确认,就是confirm模式. 消费端ack应答后,才将消息从队列中删除#确认消息已发送到队列(Queue)pub…

算法记录lday3 LinkedList 链表移除 + 链表构建 + 链表反转reverse

今日任务 ● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 链表理论基础 建议:了解一下链接基础,以及链表和数组的区别 文章链接:https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A…

【SpringBoot源码剥析】| 依赖管理

目录 一. 🦁 依赖管理Ⅰ. 部分dependency导入时为啥不需要指定版本?1.1 父依赖启动器的工作1.2 问题答案 Ⅱ. 项目运行依赖的JAR包是从何而来的?2.1 分析源码2.2 问题答案 二. 🦁 总结 一. 🦁 依赖管理 Ⅰ. 部分dependency导入时…

Linux——中断和时间管理(中)

目录 驱动中的中断处理 中断下半部 软中断 tasklet 工作队列 驱动中的中断处理 通过上一节的分析不难发现,要在驱动中支持中断,则需要构造一个 struct irqaction的结构对象,并根据IRQ 号加入到对应的链表中(因为 irq_des 已经在内核初始…

golang微服务项目通用流水线

golang微服务项目通用流水线 工作中随着业务越来越大,微服务的项目也越来越多,最开始的时候是一个服务一个流水线,然后还分了三个环境,也就是一个服务三个流水线,后面就越来越不利于管理维护了,因此&#…

马云的创业故事及他人生中的摆渡人-创建阿里巴巴(五)

著名的“18罗汉大会” 以及“马云成功背后的男人” 1999年大年初五,杭州湖畔花园小区,18个人坐满了一屋子, 这是阿里巴巴的第一次全员大会,马云激情澎湃地讲了2个小时,并且专门请了摄影师全程录像。 这就是传说中的…

SD卡无法识别怎么办?

SD卡是一种可移动存储设备,广泛应用于各种电子设备,如Android智能手机、平板电脑或相机等,您可以将SD卡连接到计算机以传输一些文件。但有些时候,当您打开文件资源管理器后,可能会发现您的SD卡不显示,无法使…

即时通讯IM源码应该如何做好安全防护?

即时通讯(Instant Messaging,IM)在现代社会中已经成为了人们日常生活中必不可少的沟通工具。无论是在家庭、教育、商业或政府等各行各业中,IM都扮演着重要的角色。然而,随着IM使用率的增加,相应的安全威胁也…

程序员基础的硬件知识(cpu、主板、显卡、内存条等)

一、综合简介 cpu:负责运算数据,就等于你的大脑运算速度。 显卡:本来没有显卡,后来因为大家对图片要求越来越高,视频要求越来越高,啥都让cpu算太累了,于是分出来一个,专门用来计算…

华为云服务EulerOS release 2.0 版本安装大象数据库

1连接华为服务器 下载并按照命令yum install -y postgresql-server 2 初始化 postgresql-setup initdb 3启动 systemctl start postgresql.service 启动服务 4开放端口(如果防火墙已经关闭则可以省略) iptables -I INPUT -p tcp --dport 5432 -j ACCEPT 5验证安装结果&…

Cortex-A7中断详解(二)

CP15协处理器 CP15协处理器一般用于存储系统管理,但是在中断中也会使用到,CP15协处理器一共有16个32位寄存器。CP15协处理器的访问通过以下指令完成: MRC:将CP15协处理器中的寄存器数据读到ARM寄存器中。MCR:将ARM寄…

坚持刷题2个月,终于去了梦寐以求的大厂....

写在前面 最近一个读者和我反馈,他坚持刷题2个月,终于去了他梦寐以求的大厂,薪资涨幅非常可观,期间面字节跳动还遇到了原题…并表示目前国内的大厂和一些独角兽,已经越来越效仿硅谷公司的做法,通过面试给定…

软件测试的测试用例

1.白盒和黑盒测试: 黑盒测试:把代码看成一个黑盒子,只关心输入和输出结果之间的关系 产品功能是否符合要求; 白盒测试:能够看到代码本身,针对代码本身进行测试,测试代码本身的逻辑是否符合规范。 2.测试用…

常用图标(icon)css下载

1、演示图例(icon1.css)[24*18] 2、演示图例(icon2.css)[24*24] 3、演示图例(icon3.css)[24*24] 4、演示图例(icon4.css)[24*18] 5、演示图例(icon5.css)[26*…

C/C++每日一练(20230426)

目录 1. 不喜欢带钱的小C 🌟🌟 2. 数组排序 ※ 3. 超级素数 ※ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不喜欢带钱的小C 小C不喜欢带钱&#xff0c…

linux 安装zsh shell工具

安装zsh sudo apt install zsh chsh -s /bin/zsh sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 这一步需要网络状态比较好 ~$ git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~$ ~/.fzf/i…

USB2.0、USB3.0和typec引脚定义

USB2.0 USB 2 (Type A) pinout PinNameDirectionColorDescription1Vred5 V power2D-←→whiteData -3D←→greenData 4GNDblackGround USB 2 (Type B) pinout PinNameDirectionColorDescription1Vred5 V power2D-←→whiteData -3D←→greenData 4GNDblackGround USB Mini/M…

输入 jupyter notebook 报错 ModuleNotFoundError: No module named ‘pysqlite2‘ 解决方案

今天在cmd命令行中输入jupyter notebook想要打开jupyter时,出现了以下问题:即找不到模块‘pysqlite2’。 找到出问题的文件“sessionmanager.py”,发现出问题的地方在于:尝试导入sqlite3没有导致失败 因此,以下是解决…