【设计模式】 原则

单一职责原则

对于一个类而言,有且仅有一个引起他变化的原因或者说,一个类只负责一个职责

如果一个类承担的职责过多,那么这些职责放在一起耦合度太高了,一个职责的变化可能会影响这个类其他职责的能力。

所以我们在做软件设计的时候,要发现职责,并且把这些职责互相分开

例子1

对于看书这件事情,用手机看书和直接看纸质书相比,肯定纸质书的效率要高一些。

因为手机的职责太多了,接打电话、听歌、看电视剧等等,我们在看书的时候,可能收别的职责的影响。

而纸质书,只有一个职责,沉浸式读书。

例子2

电脑机箱中,由CPU、内存、硬盘、显卡、主板等等。

假设我们的CPU、内存、应该、显卡是高层模块,电脑中应该叫易插拔,都插到主板中。

对于电脑这个主体而言,就符合单一职责原则,内存条坏了,不会影响CPU、磁盘和主板。

开闭原则

对扩展开发,对修改封闭【多扩展、少修改】

当我们面对新需求的时候,对程序的修改只是通过增加代码的方式,而不用去修改已有的代码。

这样做我们程序变得更加,可扩展、可维护、可服用、灵活性。

例子

假设现在我们由两个模块,一个是高层模块(做业务逻辑模块),一个底层模块(数据库模块)。

数据库的一些常见操作比如:增删改查,但是我们使用的数据库可以是MySQL、SQLServer、Postgresql等等。

那么如果做到开闭原则呐,抽象出一个类,如果新加了数据库去继承这个类,然后自己去实现增删改查接口。

这样就做到了对扩展开发,对修改封闭了。

依赖倒置原则

高层模块不应该依赖于底层模块,他们都应该依赖于抽象

我们要针对接口编程,而不是针对实现编程

例子1

电脑举例,CPU、内存、硬盘、显卡都应该依赖于抽象接口,而不是依赖于具体的主板。

如果依赖于具体的主板,那么主板坏了,这些高层的设备都用不了了,这样设计显然不合理。

例子2

还是上面那个例子,高层模块(业务逻辑层)和底层模块(数据库层)都不应该互相依赖,而是依赖于抽象。

高层模块 => 抽象 => 低层模块

抽象其实就是基类,底层模块是子类。

MySQL、SQLServer、PostgreSQL都有增删改查操作,假设有一天要用到别的数据库

只需要再创建一个类,继承抽象去实现这些接口,对于高层模块而言,不需要任何的改变(或者只需要改变new的对象而已)

里氏替换原则

子类必须能够替代父类
例子

假设鸟是父类,那么鸵鸟和企鹅能继承于鸟类吗?

如果按照初中老师讲的,鸵鸟和企鹅虽然不能飞,但是属于鸟类。

但是再我们编程的世界里面,如果鸵鸟和企鹅可以继承鸟类,这是不合理的,违反了里氏替换原则。

还是举一个例子,他们的高层模块 => 抽象 => 低层模块

如果抽象中要使用的方法就是鸟的会飞的方法,但是我们底层模块是鸵鸟,根本不会飞,这样就会产生严重的错误

所以里氏替换原子是实现依赖倒置原则的基础

相关推荐
jsonbro5 小时前
手把手带你实现发布订阅模式
前端·vue.js·设计模式
workflower6 小时前
室内外配送机器人-应用路径
人工智能·机器学习·设计模式·矩阵·自动化
ttod_qzstudio12 小时前
【软考设计模式】原型模式:“克隆“对象与深拷贝、浅拷贝精讲
设计模式·原型模式
geovindu12 小时前
java: Builder Pattern
java·开发语言·后端·设计模式·建造者模式·生成器模式
researcher-Jiang1 天前
Design Patterns——Template Method入门到情景实战
python·设计模式·模板方法模式
饼干哥哥1 天前
用Claude Code跑通跨境电商的5大场景,顶10个人的团队
人工智能·设计模式·正则表达式
折哥的程序人生 · 物流技术专研1 天前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
折哥的程序人生 · 物流技术专研1 天前
第3篇:手写一个饮品制作模板(附代码)
java·设计模式·行为型模式·模版方法模式·钩子方法·代码复用·编程实战
ttod_qzstudio2 天前
【软考设计模式】单例模式:唯一实例的管控与线程安全精讲
单例模式·设计模式
折哥的程序人生 · 物流技术专研2 天前
第4篇:模板方法 vs 策略模式,面试怎么选?
java·设计模式·策略模式·行为型模式·模版方法模式·扩充系列·继承v组合