设计模式——23种设计模式学习总结
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。
系列文章目录
- 简单工厂模式
- 策略模式模式
- 装饰模式(进行中)
- 代理模式(进行中)
- 工厂方法模式(进行中)
- 原型模式
- 模板方法模式
- 外观模式
- 建造者模式
- 观察者模式
- 抽象工厂模式
- 状态模式
- 适配器模式
- 备忘录模式
- 组合模式
- 迭代器模式
- 单例模式
- 桥接模式
- 职责链模式
- 中介者模式
- 享元模式
- 解释器模式
- 访问者模式
文章目录
- 系列文章目录
- 前言
- 设计原则
- 单一职责原则
- 开放-封闭原则
- 依赖倒置原则
- 里氏替换原则 (LSP)
- 迪米特法则(最少知道原则)
- 合成/聚合复用原则
- 设计模式之间的关系
- UML图说明
- 推荐资料
- 总结
前言
本文为23种设计模式学习,参考大话设计模式,网络视频教程并结合本人工作中使用经验总结…
本人为Unity C#开发者.本文源码语言为C#,但并不影响其他语言使用者参考借鉴.
设计原则
例子偏口语化解释.部分不精准,仅理解含义即可.
单一职责原则
- 原理:(专注如一)一个类仅有一个一起变化的原因.
- 作用:避免过多的职责耦合在一起.减少变化发生时,设计受到的意外破坏.
- 例子:
- 正例:相机仅拍照,坏了仅影响拍照.
- 反例:手机功能多,电池突然坏了.打电话,拍照,付款,借钱等等都受到影响.
开放-封闭原则
- 原理:(别改我代码,自己写脚本去)软件实体(类,模块,函数等)可以扩展,但不能修改.
- 作用:对新功能/新需求,通过增加新代码,而不是改动已有代码.不是完全不能改,而是尽量少改动,提前预判,对频繁变化的部分抽象.
- 例子:
- 正例:主机,各模块负责自己的功能,内存不够加内存,硬盘没空间加硬盘.
- 反例:十几个功能模块写进一个函数里.一个函数方法几千行代码,谁会想去阅读,去维护.
依赖倒置原则
- 原理:
- (针对接口编程,而不是实现)高层模块不应该依赖低层模块。两个都应该依赖抽象
- 抽象不应该依赖细节,细节应该依赖抽象
- 作用:高层和底层模块若都是针对接口编程.那么只要接口稳定,其他的改了不必担心受影响.
- 例子:
- 正例:CPU,内存条,显卡都是对主板接口编程.某样东西坏了,不影响主板上其他的使用.注:内存条,显卡的插口槽样式固定的,无论哪家产的都能插上去.
- 反例:我家门锁坏了.锁芯不是通用版的(好像是老版或者对应的定制版),只能把整个锁及周边都换了艹.
里氏替换原则 (LSP)
- 原理:(子承父业)子类型必须能替换掉它们的父类型,
- 作用:
- 由于子类型的可替换性才使得父类类型的模块在无需修改的情况下可以扩展,使得子类能在父类基础上增加新行为.
- 接口也是遵循里氏替换原则,所以可以用接口容器装对象.可以实现 装载各种毫无关系但是却有相同行为的对象
- 例子:
- 正例:猫和牛羊狗猪都有吃喝跑叫等行为,可以继承统一的动物类.
- 反例:在面向对象设计时,一个是鸟类,一个是企鹅类,如果鸟是可以飞的,企鹅不会飞,那么企鹅是鸟吗?企鹅可以继承鸟这个类吗?
不能算.不能继承.
迪米特法则(最少知道原则)
- 原理:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
- 作用:降低类之间的耦合度。
合成/聚合复用原则
- 原理:尽量使用合成/聚合的方式,而不是使用继承。
- 作用:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物
- 例子:
- 正例:合成/聚合复用原则
- 反例:大量使用继承.继承是一种强耦合的结构。父类变,子类就必须要变。
设计模式之间的关系
UML图说明
+表示public
-表示private
#表示protected
接口有两种表现方法:
第一种,顶端<> 标注,第一行接口名,第二行接口方法
第二种,棒棒糖表示法,圆旁接口名,接口方法在实现类中出现.
interface ILanguage { void Speak (); }
继承关系:空心三角形+实线
实现接口:空心三角形+虚线
关联关系:实线(类中引用对应对象) ——企鹅和气候
聚合关系:空心菱形+实线箭头 (聚合表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分) ——大雁和雁群
合成关系:实心菱形+实线箭头 (合成(Composition,也有翻译成‘组合’的)是一种强的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样) ——鸟和翅膀
注:1和2为基数,表示这一段的类有几个实例.无数可以用n表示.关联关系和聚合关系也可以有基数.
依赖关系:虚线箭头 ——动物新陈代谢依赖氧气和水.
abstract class Animal { public Metabolism (Oxygen oxygen,Water water) { } }
推荐资料
<<大话设计模式>>
原因:描写生动形象贴近生活中案例,将抽象内容更形象化表达,适合入门及掌握.为本人学习时参考使用.
<<大话设计模式>>百度介绍链接
<<Head First 设计模式>>
原因:HeadFirst系列,基础,入门,详细,厚.
<<Head First 设计模式>>百度介绍链接
设计模式经典书籍推荐
设计模式参考
菜鸟教程
总结
保持饥饿,保持愚蠢.
这世界唯一能够相信的就是你付出的努力和你走过的路.
设计模式——23种设计模式学习总结相关推荐
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...
- 追MM与设计模式(23种设计模式巧妙解析,趣味理解)
关注"java后端技术全栈" 回复"000"获取优质面试资料 瞎扯一会 大家好,我是老田,今天给大家分享如何通俗易懂的理解设计模式. 设计模式作为我们程序员必备 ...
- 设计模式—23种设计模式
23种设计模式 单例模式 工厂模式 抽象工厂模式 模板方法模式 建造者模式 代理模式 原型模式 中介者模式 命令模式 责任链模式 装饰模式 策略模式 适配器模式 迭代器模式 组合模式 观察者模式 门面 ...
- java设计模式:23种设计模式及其源代码演示实现
java23种设计模式及其源代码演示实现 博主在CSDN已有三年,之前一直在看贴,受益颇多,不可多得的一个良好的学习平台,这一次,博主给大家分享一份传说中的java设计模式,源代码与其实现全部都有,希 ...
- 图解Java设计模式-23种设计模式
设计模式分为三种类型,共 23 种 1) 创建型模式 :单例模式 .抽象工厂模 式原型式.建 造者模式.工厂模 式. 2) 结构型模式 :适配器模式.桥接装饰模式 .组合模式.外观模式.享元模式.代理 ...
- java设计模式 23种设计模式和思想
设计模式 1.概述 设计模式不是一种语法上的规定,而是一种思想,是解决特定场景问题所总结出的一系列方法,可以灵活运用在我们实际开发中,提高我们代码的扩展性,可读性,稳健性,和复用性,从而使我们编写 ...
- (六)JAVA设计模式23种设计模式之适配器模式实例demo
适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的 ...
最新文章
- java里面有控制器吗_java怎么运行控制器里的类 java控制台输入类以及
- 工业互联网平台创新发展白皮书(2018)
- php中public放什么,PHP中常用关键字public, private, protected, static...
- Spine学习六 - 碰撞检测
- 【计算机网络复习 数据链路层】3.6.1 局域网
- Java 工厂模式学习
- Python版组合数计算方法优化思路和源码
- erlang 读取confg文件异常 could not start kernel pid error in config file
- System V信号量
- AD13中对工程进行编译出现的error
- hdoj 2122 Ice_cream’s world III【最小生成树】
- OAuth 2.0 开放授权的那些事儿
- 精益创业:创业2年被京东收购、今夜酒店特价创始人任鑫的反省
- postgres的brin索引
- 支付宝支付服务端对接记录(小程序/APP 预支付统一下单及回调处理)
- java生成统计图_java生成各种统计图
- 保龄球计分c语言,保龄球的好处、起源、计分规则、常用技法
- HTML5网页设计制作基础大二dreamweaver作业、使用HTML+CSS技术制作博客网站(5个页面)...
- 初试Android原生弹窗
- linux内核:时间与jiffes互相转换
热门文章
- GD32F303固件库开发(17)----内部Flash读写
- 阻塞队列(三):DelayQueue
- 智能运维 | 六度亮剑SREcon,百度引领智能运维新风向
- Maven2的相关知识[zt]
- stackoverflow热门问题(二)- 如何确定C的数组的大小
- Ghidra Java API报NoClassDefFoundError的解决方法
- 用nodejs爬数据
- VMW配置FusionStorage Manager(FSM)虚拟机主备
- QT 5.12 安装MinGW 7.3.0 32bit
- rockchip 网络adb使用_R1通过adb shell命令查看软件版本号