设计模式设计模式的六大原则与三大分类

Posted 小飞快飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式设计模式的六大原则与三大分类相关的知识,希望对你有一定的参考价值。

文章参考资源,安利一波:
https://refactoringguru.cn/ 图⽂设计模式资料
https://www.runoob.com/ 菜鸟教程
重学Java设计模式·小傅哥(公众号:bugstack虫洞栈)

设计模式是什么 ?

设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。
设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性概念。 你可以根据模式来实现符合自己程序实际所需的解决方案。
人们常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。 但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。 同一模式在两个不同程序中的实现代码可能会不一样。
算法更像是菜谱: 提供达成目标的明确步骤。 而模式更像是蓝图: 你可以看到最终的结果和模式的功能, 但需要自己确定实现步骤。

为什么要学设计模式?

设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。 即使你从未遇到过这些问题, 了解模式仍然非常有用, 因为它能指导你如何使用面向对象的设计原则来解决各种问题。
设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。 你只需说 “哦, 这里用单例就可以了”, 所有人都会理解这条建议背后的想法。 只要知晓模式及其名称, 你就无需解释什么是单例。

设计模式的六(七)⼤原则是什么?

即SOLID,(solid,稳定的),其代表的含义就是这六个原则结合使用的好处:建立稳定、灵活、健壮的设计
1、单⼀职责(⼀个类和⽅法只做⼀件事)
2、⾥⽒替换(多态,⼦类可扩展⽗类)
3、依赖倒置(细节依赖抽象,下层依赖上层,面向接口编程)
4、接⼝隔离(建⽴单⼀接⼝,高内聚低耦合)
5、迪⽶特原则(最少知道,降低耦合)
6、开闭原则(抽象架构,扩展实现)
7、合成复用原则(尽量使用合成/聚合的方式,而不是使用继承)
有些叫六大原则,有些叫七大原则,六大原则只是少了合成复用原则

设计原则一:单⼀职责

单⼀职责(Single Responsibility Principle)
不要存在导致一个导致类变更的原因,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。一个Class/Interface/Method只负责一项职责。

设计原则二:⾥⽒替换

⾥⽒替换(Liskov Substitution Principle)
即LSP原则,里式替换的原则是,所有基类的地方,都可以换成子类,程序还可以正常运行;子类可以扩展父类的功能,但是不能改变父类原有的功能。
如果一个软件实体适用一个父类的话,那一定是适用其子类,所有引用父类的地方必须能透明地适用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变,实际使用中有以下原则:
1、子类可以实现父类的抽象方法,但不能覆盖的非父类的非抽象方法。
2、子类中可以增加自己持有的方法
3、当子类的方法重载父类的方法时,方法的前置条件(即方法的输入/入参)要比父类方法的输入参数更宽松。
4、当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类更严格或相等
⾥⽒替换的优点:
1、约束继承泛滥,开闭原则的一种体现。
2、加强程序的健壮性,同时变更时也可以做到非常好的兼容性,提高程序的维护性、扩展性。降低需求变更时引入的风险。

设计原则三:依赖倒置

依赖倒置(Dependence Inversion Principle)
“面向接口编程” 或者说 “面向抽象编程”,任何类都不应该从具体类中派生。高层模块不应该依赖底层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象,通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并能够降低修改程序所造成的风险,(采用接口模式 ,通过注入方式,依赖注入,构造器注入,setter注入)。

设计原则四:接⼝隔离

接⼝隔离(Interface Segregation Principle)
接口不是仅仅指接口(Interface),还包括其中的抽象类。原则是指用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。换句话说就是接口中的所有方法对其实现的子类都是有用的,否则,就将接口继续细分。 概念上与单一职责很像,都是强调要将接口进行细分,只是方式不同,单一职责是按照职责划分接口的,而接口隔离是按照实现类对方法的使用来划分的,接口隔离更细一些。
1、一个类对一类的依赖应该建立在最小的接口之上。
2、建立单一接口,不要建立庞大臃肿的接口。
3、尽量细化接口,接口中的方法尽量少(不是越少越好,一定要适度)。
4、接口高内聚,接口的更改不会影响到其他接口和实现类,只能影响自己。
优点是具有很好的可读性、可扩展性和可维护性。

设计原则五:迪⽶特原则

迪⽶特原则(Law of Demeter)
一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。
通俗的讲就是,写类时,public的方法都是会暴露出去的,不需要暴露的就不要public,这样就可以保证最少知道原则。

设计原则六:开闭原则

开闭原则(Open Closed Principle)
对修改关闭,对拓展开放。用抽象构建框架,用实现拓展细节,提高软性系统的可复用性和维护性,需要修改就采用继承或实现方式扩展。
在LSP中,要避免子类重写父类中已实现的方法,继承父类就是对其进行扩展,但没有进行修改,这就是开闭原则很好的体现。LSP原则强调了基类与子类的关系,其中的一种实现方式用到了开闭原则。

设计原则七:合成复用原则

合成复用原则(Composite Reuse Principle)
尽量使用对象组合(has-a)/聚合(contanis-a),而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。继承我们叫做白箱复用,相当于把所有的实现细节暴露给子类。组合/聚合也称之为黑箱复用,对类以外的对象是无法获取到实现细节的。

设计原则总结

设计原则是学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构

设计模式分类


图片来自 https://refactoringguru.cn/

不同设计模式的复杂程度、 细节层次以及在整个系统中的应用范围等方面各不相同。 比于道路的建造: 如果你希望让十字路口更加安全, 那么可以安装一些交通信号灯, 或者修建包含行人地下通道在内的多层互通式立交桥。
最基础的、 底层的模式通常被称为惯用技巧。 这类模式一般只能在一种编程语言中使用。
最通用的、 高层的模式是构架模式。 开发者可以在任何编程语言中使用这类模式。与其他模式不同, 它们可用于整个应用程序的架构设计。
主要分为三种类型的模式:
1、创建型模式,提供创建对象的机制, 增加已有代码的灵活性和可复用性。
2、结构型模式,介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。
3、行为模式,负责对象间的高效沟通和职责委派

模式分类一:创建型模式

工厂方法、抽象工厂、生成器、原型、单例

模式分类二:结构型模式

适配器、桥接、组合、装饰、外观、享元、代理

模式分类三:行为模式

责任链、命令、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者

每种设计模式的具体分析与使用将在后续文章中持续呈现,欢迎关注与讨论~~

以上是关于设计模式设计模式的六大原则与三大分类的主要内容,如果未能解决你的问题,请参考以下文章

设计模式设计模式的六大原则与三大分类

Java中23种设计模式:六大设计原则的分析与介绍

设计模式设计模式的分类及六大原则

设计模式六大原则:依赖倒置原则

设计模式六大原则:依赖倒置原则

六大设计原则DIP依赖倒置原则