【笔记】设计模式 | 5种设计模式笔记整理
跟着b站的设计模式教程学的,以下是目前学习了的5种设计模式的笔记整理
设计模式简介
软件设计的现状:由于客户需求等原因需要频繁的变更软件内部的代码。所以能否设计出复用性尽可能高的程序以解决软件设计的复杂性,是评判一个软件设计好不好的关键。
如何解决复杂性?
分解:分解是人们的一种解决问题的常规思路,分而治之,将大问题–>小问题,复杂问题–>简单问题
抽象:忽视本质细节而去处理泛化和理想化的对象模型(;利用多态的方法就是一个例子)
面向对象的设计原则
理念:变化是复用的天敌,而面向对象设计就是为了抵御变化
面向对象的特点:
各司其职(面向对象强调各个类各司其职,由于需求变化导致的新增类型不应该影响原来类型的实现)
对象是什么?
语言层面:封装了代码和数据
规格层面:是一系列可被使用的公共接口
概念层面:是某种拥有独立 责任的抽象
原则1:依赖倒置原则(DIP)
- 高层模块(稳定的)不应该依赖于低层模块(变化的、不稳定的),二者都应该依赖于抽象(稳定的)
- 抽象(稳定)不应该依赖于实现细节(变化的),实现细节应该依赖于抽象(稳定的)
(上面这种模式会倒置了,变化会导致mainform不稳定)
(因为隔离了变化,发生变化是,mainform和shape依然稳定)
原则2:开放封闭原则(OCP)
- 对拓展开放,对更改封闭:当有新的需求时,应采用增加来满足而不是通过更改来满足
- 类模板应该时可拓展的,但不可修改
原则3:单一职责原则(SRP)
- 一个类应该仅有一个引起它变化的原因(各司其职)
- 变化的方向隐含着“类的责任”,而一个类不应该隐含多个责任
原则4:Liskov替换原则(LSP)
子类必须能够替换它们的基类(IS-A)
继承表达类型抽象
原则5:接口隔离原则(ISP)
不应该强迫客户程序依赖它们不用的方法(区分清楚哪些时public暴露出去的,哪些时自用private的)
接口应该小而完备
原则6:优先使用对象组合,而不是类继承
- 类继承”白箱复用“;对象组合“黑箱复用”
- 继承在某种程度上破坏了封装性,子父的耦合度较高
- 对象组合只要求被组合的对象有良好定义的接口,耦合度低
原则7:封装变化点
- 使用封装来创建对象之间的分解层,让设计者进行一侧的修改时不会对另一侧产生不良影响
原则8:针对接口编程,而不是针对实现编程(与原则1相辅相成)
- 不将变量类型声明为某个特定的具体类,而是声明成接口
- 客户程序无需获知对象的具体类型 ,只需知道对象所具有的接口
- 减少系统各部分的依赖关系,实现“高内聚,松耦合”的类型设计方案
核心:接口标准化
设计原则–>设计经验
- 设计习语(Design Idioms):描述与特定编程语言相关的低层模式,技巧,惯用法
- 设计模式(Design Patterns):描述“类与相互通信的对象之间的组织关系,包括它们的角色,职责 ,协作方式等”(主要解决变化中的复用性问题)
- 架构模式(Architectural Patterns):描述系统中与基本结构组织关系密切的高层模式,包括子系统划分,职责,以及如何组织它们之间关系的规则
重构关键技法
- 静态(绑定)—》动态(绑定)
- 早绑定—》晚绑定
- 继承—》组合
- 编译时依赖—》运行时依赖
- 紧耦合—》松耦合
策略模式
定义:将一系列算法封装起来,使它们可以相互替代(可以变化)。从而使得算法可独立于使用它的客户程序(稳定的)而变化(拓展,子类化)----》“用拓展的方式应对需求的变化”
结构:
总结:
- Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便得根据需要在各个算法间切换(多态调用)
- 当程序中出现很多条件判断(if else/switch case)的场景,且后续可能还有其它情况需要增加时,想到用Strategy模式(除非确定可能性不再变化)
- 如果Strategy对象没有实例变量,那么各个上下文可共享同一个Strategy对象,从而节省开销
观察者模式
定义:定义了对象间的一种**一对多(变化)**的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
结构:
总结:
- Observer模式使得我们可以独立地改变目标与观察者,使二者做到松耦合
- 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播
- 观察者自己决定是否需要订阅通知,目标对象对此一无所知
- Observer模式是基于时间的UI框架中非常常用的设计模式,也是MVC(Model-View-Controllor)模式的重要组成部分
桥模式
定义:将抽象部分(如:业务功能:简介版,经典版,豪华版…)与实现部分(如:不同平台的实现:PC,PE…)分离,使它们可以独立地变化(拓展时不相互影响)
结构:
总结:
- Bridge模式使用”对象间的组合关系“解耦了抽象和实现之间固有绑定关系,使得抽象和实现可以沿着各自的维度来变化,即“子类化”它们
- Bridge模式有时类似于多继承方案,但多继承方案往往违背了单一职责原则(即一个类只有一个变化的原因),复用性差。而Bridge模式是更好的解决方法
- Bridge模式的应用一般在”两个非常强的变化维度“,有时一个类也有多于两个的变化维度,这时可用Bridge的扩展模式(将聚合度较高的一些变化打包(抽象)成一个基类,再用抽象指针)
工厂模式
“对象创建”模式:通过”对象创建“模式绕开new,来避免对象创建(new)的过程中导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。从而使得一个类的实例化延迟(目的:解耦(解除new后面具体类的耦合 );手段:虚函数)到子类
结构:
总结:
- Factory 模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
- Factory模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好的解决了紧耦合关系
- Factory模式解决“单个对象”的需求变化。(缺点在于要求创建方法/参数相同)
单件模式
“对象性能”模式:面向对象解决了”抽象“的问题,但是不可避免要付出一定的性能代价(如虚函数),虽然通常情况来讲,面向对象的成本大都可以忽略不计(尤其得益于c++语言自身良好的性能),但某些情况,面向对象所带来的成本问题需要谨慎处理
需求:在软件系统中,常有一些特殊的类,需要保证它们在系统只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。那么,如何绕过常规的构造器,通过提供一种机制来保证一个类只有一个实例?(即限制使用者创建多个类)
定义:保证一个类仅有一个实例,并提供一个该实例的全局访问点
结构:
实例:
线程非安全版本:单线程没问题,但多线程时可能会出现多个对象实例出现的问题
线程安全版本:加一个“锁”(在一个线程中的锁的实例还未被析构时,其它线程无法进入)可以解决多线程的问题,保证只有一个实例对象存在,但锁的代价过高(”锁“其实只有在创建(写)的时候需要来限制多进程,但是在(读)对象时,是不会出现创建了多个实例对象的问题,所以已经不需要锁了)
双检测锁:锁前锁后都判断是否已存在一个唯一的实例对象(但由于内存读写reorder(CPU内部处理顺序与我们设想的顺序不同)而不安全)
- eg:
m_instance = new Singleton();
这一步我们设想的分解步骤是(分配内存–》构造–》指针指向内存)。而实际上可能会出现reorder的现象,即(分配内存–》指针指向内存–》构造)。而如果此时其它线程进入并判定m_instance
不为空,就可能直接使用了m_instance
,从而出现安全隐患。
- eg:
双检测锁防reorder实现
总结:
- Singleton模式中的实例构造器可以设置为protected以允许子类派生
- Singleton模式一般不要支持拷贝构造函数和Clone接口,因为可能导致出现多个对象实例
- Singleton模式的重点和难点就是双检查锁的正确实现
有一些目前还不是很理解,如果有出错的请斧正,谢谢!
【笔记】设计模式 | 5种设计模式笔记整理相关推荐
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...
- 设计模式——23种设计模式学习总结
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. 系列文章目录 简单工厂模式 策略模式模式 装饰模式(进行中) 代理模式(进行中) 工厂方法模式 ...
- Java两种设计模式_23种设计模式(11)java策略模式
23种设计模式第四篇:java策略模式 定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这 ...
- java设计模式:23种设计模式及其源代码演示实现
java23种设计模式及其源代码演示实现 博主在CSDN已有三年,之前一直在看贴,受益颇多,不可多得的一个良好的学习平台,这一次,博主给大家分享一份传说中的java设计模式,源代码与其实现全部都有,希 ...
- 追MM与设计模式(23种设计模式巧妙解析,趣味理解)
关注"java后端技术全栈" 回复"000"获取优质面试资料 瞎扯一会 大家好,我是老田,今天给大家分享如何通俗易懂的理解设计模式. 设计模式作为我们程序员必备 ...
- 设计模式—23种设计模式
23种设计模式 单例模式 工厂模式 抽象工厂模式 模板方法模式 建造者模式 代理模式 原型模式 中介者模式 命令模式 责任链模式 装饰模式 策略模式 适配器模式 迭代器模式 组合模式 观察者模式 门面 ...
- (六)JAVA设计模式23种设计模式之适配器模式实例demo
适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的 ...
最新文章
- J. Cheminform. | DrugEx v2:多重药理学中基于pareto的多目标强化学习的药物分子从头设计...
- DiscuX END - 553 Envolope sender mismatch with header from..
- Web前端开发笔记——第二章 HTML语言 第十一节 语义标签
- ORM是什么?如何理解ORM
- python 自动输入用户密码_Linux中Python自动输入sudo 密码
- showmount -e (CVE-1999-0554) NFS漏洞解决方案
- Java继承知识之基本控制语句(if、switch与穿透现象)
- 按周汇总_有合并单格及空行的数据如何快速汇总?简单几步快速搞定
- STM32 USART 波特率计算
- MySQL索引实现、MySQL索引原理、索引下推、索引覆盖、索引失效
- 20210725:FLAC刻录音乐CD教程01-下载安装Nero打补丁
- 到底什么是模型预测控制MPC(一)
- JDBC(尚硅谷宋红康老师笔记)
- 零基础SSM入门教程(50)–Spring总结与展望SpringBoot、SpringCloud
- 在Azure上搭建SQL云数据库
- win10系统C盘根目录里文件夹都是干什么的
- 垃圾分类机器人、无线电子皮肤、孟加拉转基因金稻...| 技术前沿洞察
- The Shawshank Redemption-1
- 为什么不建议在MySQL中使用 utf8?
- 面朝大海, 春暖花开
热门文章
- 川藏自驾游的神州租车攻略
- 妊娠对静息状态大脑活动、白质微结构、神经代谢物浓度和灰质结构的影响
- EasyPoi导出Excel实现标记颜色
- 纯净安装 Windows 11 官方原版系统的方法图解(适用强迫症患者)
- 3.MySQL数据库的索引
- nginx的DR模式
- Windows10家庭版 VMWare15 安装虚拟机启动时出现 蓝屏(而且重启)问题
- ubuntu 内存占用过高导致卡死 解决办法
- 【JavaScript】懒加载
- python open unicodedecodeerror_python 读取文件时报错UnicodeDecodeError: 'gbk' co