【设计模式】综述

news2024/10/2 3:07:40

设计模式概述

在这里插入图片描述



😊点此到文末惊喜↩︎


一、设计模式

1. 基本简介

  1. 定义:设计模式是一个针对重复发生的问题的解决方案核心
  2. 核心目标:将问题中变化的部分进行封装,而重用不变的部分
  3. 模式的基本要素
    • 模式名:是一个助记词,方便与其他人交流和形成规范的工程文档
    • 问题: 通过前因后果选择相应的设计模式
    • 解决方案:设计模式在具体应用场景的特化
    • 效果:通常考虑的是软件的拓展性、复用性和封装性
  4. 两个项目思维方式
    • 抽象思维:自低向上,通过不断抽象降低项目复杂度
      • 面向对象
      • 组件封装
      • 设计模式
      • 架构设计
    • 底层思维:自顶向下,从机器运行角度把握对象构造
      • 语言转换
      • 编译转换
      • 内存模型
      • 运行时机制
  5. 面向对象的三大机制
    • 封装:隐藏内部实现
    • 继承:复用现有代码
    • 多态:改写对象行为
  6. 软件领域的复杂性的根本原因是 :需求的变化
  7. 解决复杂性的方式
    • 分解:从不同维度,将复杂问题进行划分成多个简单问题(每个维度都是一种分解方法,评判标准是可复用性)
    • 抽象:忽略非本质细节,降低复杂性。尽量进行统一处理,复用代码
  8. 设计模式依赖设计原则
  9. 模式分类
    • 创建型模式Creational:将对象的部分创建工作进行封装,从而避免需求变化对对象创建的冲击
    • 结构型模式Structural:通过类的继承或对象的组合,从而应对需求变化对对象结构带来的冲击
    • 行为型模式Behavioral:通过类的继承或对象的组合来划分不同类之间的职责,从而应对需求变化为多个交互对象造成的冲击
  10. 设计模式的使用
    • 寻找变化点,然后在变化点处应用设计模式
    • 重构,先构造基本模型,然后寻找问题,找到最好的解决这个问题的设计模式
  11. 重构的常用方式
    • 静态转化成动态
    • 早绑定转化成晚绑定
    • 继承转化成组合
    • 编译时依赖转化成运行时依赖
    • 紧耦合转化成松耦合c
  12. 思考类的设计模式,要看其中的稳定和变化的部分
  13. 代码的复用性是指编译形成的二进制意义上的相同,通常是编译时代码复用,执行时动态链接

2. 面向对象设计原则

  1. 面向对象设计的原则
    • 隔离变化:通过抽象将变化带 来的影响减为最小
    • 各司其职:接口相同,通过多态实现不同,各负其责
  2. 设计原则:首字母缩写SOLID(稳定的)
    • 单一职责原则(Single Responsibility Principle)
      • 一个类应该只有一个引起它变化的原因
      • 变化的方向隐含类的责任
    • 开放封闭原则(Open Closed Principle)
      • 对拓展开放,对更改封闭。即模块可拓展但不可修改源代码
      • 使用拓展的方式应对变化
    • 里氏替换原则(Liskov Substitution Principle)
      • 子类必须能够替换它们的基类
      • 继承表达类型抽象
    • 最少知道法则(Law of Demeter)
      • 每个类都应该尽可能的减少对其他类的依赖,交流通过友元类进行
      • 可能造成系统中出现大量传递类调用关系的友元类
    • 接口隔离原则 (Interface Segregation Principle)
      • 尽量减少用户对于接口方法的依赖,避免接口更改引起的问题
    • 依赖倒置原则DIP(Dependence Inversion Principle)
      • 提出抽象类,处理变化
      • 稳定的高层模块不应该依赖于易变化的底层模块,而都应该依赖于稳定的抽象
      • 稳定的抽象不应该依赖于易变化的实现细节
    • 优先使用对象组合,而不是类继承
      • 继承某种程度上破坏了封装性,子类和父类耦合度高
      • 被组合的对象必须具有良好定义的接口
    • 封装变化点
      • 变化点是指一侧变化,一侧稳定。变化一侧的修改不会影响稳定一侧
    • 面向接口编程,而不是实现
      • 客户程序无需获知对象的具体类型,只需要知道对象的接口

二、基本类别

1. 创建型模式

  1. 简单工厂模式Factory Method

会更新每种模式的详细博客超链接,敬请期待呀


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
秘籍(点击图中书籍)·有缘·赠予你


🚩点此跳转到首行↩︎

参考博客

  1. 待定引用
  2. 待定引用
  3. 待定引用
  4. 待定引用
  5. 待定引用
  6. 待定引用
  7. 待定引用
  8. 待定引用

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

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

相关文章

使用HTTP隧道代理,请求超过频率要怎么办?

在网上,经常会看到有人说使用隧道代理经常遇到429错误(请求超过频率),我们要如何解决这一问题呢?通常情况,优质的HTTP代理厂商隧道代理服务器采用的是高性能主机构建的动态IP代理服务器,是可以支…

IO流

标题IO流的体系结构FileReader和FileWriterFileReader读入数据的基本操作FileReader中使用read(char [] cbuf)读入数据FileWriter写出数据字节流使用FileInputStream和FileOutputStream读写文本文件使用FileInputStream和FileOutputStream读写非文本文件缓冲流缓冲流&#xff0…

智慧校园平台源码:实现互联互通的校园管理一体化

智慧校园管理平台主要以校园安全、智慧校园数据管理云平台为核心,实现数据统一管理,以智慧电子班牌为学生智慧之窗,以移动管理平台、家校沟通为辅。实现教师—家长一学校—学生循环的无纸化管理模式及教学服务,实现多领域的信息互…

【JavaSE】Lambda、Stream(659~686)

659.每天一考 1.写出获取Class实例的三种常见方式 Class clazz1 String.class; Class clazz2 person.getClass(); //sout(person); //xxx.yyy.zzz.Person... Class clazz3 Class.forName(String classPath);//体现反射的动态性2.谈谈你对Class类的理解 Class实例对应着加载…

小小bat-day1-自动文件上传

前言:日常服务器备份文件或者生产设备等数据文件都统一保存至文件服务器,进行日志分析或者将生产文件CSV、图片等转存至数仓进行数据分析,尤其生产的部分数据是保存在个人电脑的PC端,数据杂,获取困难,手动整…

day45【代码随想录】动态规划之完全平方数、单词拆分、打家劫舍、打家劫舍 II

文章目录前言一、完全平方数(力扣279)二、单词拆分(力扣139)三、打家劫舍(力扣198)四、打家劫舍 II前言 1、完全平方数 2、单词拆分 3、打家劫舍 4、打家劫舍 II 一、完全平方数(力扣279&#…

2023软考报名(上半年)报名什么时候开始?-弘博创新

2023软考报名(上半年)报名预计在3月底-4月初开始,现在可以先进入备考了,参加学习可以到弘博创新,专业考前辅导多年,专业靠谱! 系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#…

Windows安装VMware虚拟机+配置Ubuntu的详细步骤以及解决配置过程中报错的问题(完整版)

目录 引言: 过程: 安装VMware虚拟机: 在VMware虚拟机中配置Ubuntu: 在VMware虚拟机中安装Ubuntu: VMware中启动虚拟机时报错问题的解决: 正式开始安装Ubuntu: 参考资料: 引言: 在学习计…

线程池源码解析项目中如何配置线程池

目录 基础回顾 线程池执行任务流程 简单使用 构造函数 execute方法 execute中出现的ctl属性 execute中出现的addWorker方法 addWorker中出现的addWorkerFailed方法 addWorker中出现的Worker类 Worker类中run方法出现的runWorker方法 runWorker中出现的getTask runWo…

Websocket详细介绍

需求背景 在某个资产平台,在不了解需求的情况下,我突然接到了一个任务,让我做某个页面窗口的即时通讯,想到了用websocket技术,我从来没用过,被迫接受了这个任务,我带着浓烈的兴趣,就…

MinIO

概述MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从…

Redis学习【7】之发布_订阅命令和事务

文章目录一 发布/订阅命令1.1 消息系统1.2 subscribe1.3 psubscribe1.4 publish1.5 unsubscribe1.6 punsubscribe1.7 pubsub1.7.1 pubsub channels1.7.2 pubsub numsub1.7.3 pubsub numpat二 Redis 事务2.1 Redis 事务特性Redis 事务实现2.1.1 三个命令2.1.2 基本使用2.2. Redi…

家用洗地机哪款质量好?洗地机排行榜

伴随着人们消费水平和生活品质的提升,人们对家庭中的需求也随之提高,洗地机凭借着吸拖洗为一体的功能深受大众喜爱,但是市面上洗地机产品越来越多,清洁效果也参差不齐,到底哪款洗地机质量好呢,跟随笔者脚步…

FILE文件操作

文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统 声明的,取名FILE…

ecaozzz

2. 图形报表ECharts 2.1 ECharts简介 ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/…

面试完阿里,字节,腾讯的测试岗,复盘以及面试总结

前段时间由于某些原因辞职了,最近一直在面试。面试这段时间,经历过不同业务类型的公司(电商、酒店出行、金融、新能源、银行),也遇到了很多不同类型的面试官。 参加完三家大厂的面试聊聊我对面试的一些看法&#xff0…

AWS攻略——子网

文章目录分配子网给Public子网分配互联网网关创建互联网网关附加到VPC给Public子网创建路由表关联子网打通Public子网和互联网网关创建Public子网下的EC2进行测试配置Private子网路由给Private子网创建路由表附加在Private子网创建Private子网下的EC2进行测试创建实例在跳板机上…

Mybatis 之useGeneratedKeys注意点

一.例子 Order.javapublic class Order {private Long id;private String serial; }orderMapper.xml<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd…

java学习--多线程

多线程 了解多线程 ​ 多线程是指从软件或者硬件上实现多个线程并发执行的技术。 ​ 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 并发和并行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在CPU上同时执行并发&#xff1…

20230217使AIO-3399J开发板上跑通Android11系统

20230217使AIO-3399J开发板上跑通Android11系统 2023/2/17 15:45 1、解压缩SDK&#xff1a;rk3399-android-11-r20211216.tar.xzrootrootrootroot-X99-Turbo:~$ tar xvf rk3399-android-11-r20211216.tar.xz 2、编译U-boot&#xff1a; rootrootrootroot-X99-Turbo:~/rk3399-a…