设计模式 - 七大原则、UML类图
一、设计模式的目的
懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。
- 代码重用性(相同功能的代码不需要多次编写)
- 可读性(规范编程,便于其他开发人员阅读和理解)
- 可扩展性(当需要增加新功能的时候,非常方便)
- 可靠性(当我们增加新功能后,对原有的功能没有影响)
- 使程序呈现高内聚、低耦合的特性(高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合); 低耦合:减少类内部,一个成员方法调用另一个成员方法。)
二、设计模式的七大原则
设计模式原则就是开发者在编程时应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这么设计的依据)。
- 单一职责原则
- 接口隔离原则
- 依赖倒置原则
- 里氏替换原则
- 开闭原则
- 迪米特法则
- 合成复用原则
1.单一职责原则
对类来说,一个类应该只负责一项职责。例如,类A负责两个不同的职责:职责1,职责2;当职责1需求改变的时候,可能会导致职责2出错,所以应当执行单一职责原则,将类A的粒度分解为A1、A2。
注意事项与细节:
1)降低类的复杂度,一个类只负责一项职责
2)提高类的可读性、可维护性
3)降低变更引起的风险
4)通常情况下,我们应当遵循单一职责原则,除非逻辑足够简单
2.接口隔离原则
客户端不应该依赖他不需要的接口,即一个类对另一个类的依赖应该建立在最小接口上
3.依赖倒置原则
1)高层模块不应该依赖低层模块,二者都应该依赖其抽象
2)抽象不应该依赖细节,细节应该依赖抽象
3)依赖倒置原则的中心思想是面向接口编程
4)依赖倒置原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构稳定得多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
5)使用接口或抽象类的目的是制定好规范,将具体的细节交给他们的实现类或子类去完成
注意事项与细节:
1)低层模块尽量都有抽象类或接口,这样程序稳定性更好
2)变量的声明类型尽量都是抽象类或接口,这样我们的变量引用和实际对象间就有一个缓冲层,更利于程序的优化和扩展
3)继承时遵循里氏替换原则
4.里氏替换原则
关于面向对象中的继承性的思考:
- 继承包含这样一层含义:父类中定义好的方法,实际上是制定了一些契约,虽然它不强制要求子类遵循这些契约,但如果子类对这些已经实现的方法随意修改,则会造成整个继承体系的混乱
- 继承给程序带来便利的同时,也带来了一些弊端,比如使用继承会给程序带来侵入性,程序可移植性降低,增加了类与类之间的耦合,如果一个类被其它类继承,那么这个类的每一次改动都要考虑到其子类
因此,我们需要遵循里氏替换原则,即:
1)所有引用基类的地方必须能够透明的使用其子类的对象
2)子类尽量不要重写父类的方法
3)在适当的情况下,可以通过聚合、组合、依赖来解决问题
5.开闭原则
开闭原则是编程中最基础、最重要的设计原则,当我们需要对一个程序进行扩展的时候,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化,编程中遵循其他原则,以及使用设计模式的目的就是遵顼开闭原则。
6.迪米特法则
1)一个对象应该对其他对象保持最少的了解
2)类与类关系越密切,耦合度越高
3)最少知道原则,即一个类对自己依赖的类知道的越少越好,也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,对外只提供public方法
4)迪米特法则还有个更简单的定义:只与直接的朋友通信,直接的朋友
注意事项与细节:
迪米特法则的核心是降低类之间的耦合,注意,是降低,并不是要求类与类之间完全没有依赖
7.合成复用原则
原则是尽量使用合成/聚合的方式,不使用继承的方式
核心思想:
1)找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2)针对接口编程,而不是针对实现编程
3)为了交互对象之间的松耦合设计而努力
三、UML类图
用于描述系统中类(对象)本身的组成和类(对象)之间的各种静态关系,类之间的关系有:依赖、泛化(继承)、实现、关联、聚合、组合。
图片来源:https://mp.weixin.qq.com/s/N92K9WwvHdpbej2btC-ofA
如上图所示:
- 依赖关系:只要类中使用到了对方,它们就是依赖关系,用虚线箭头表示
- 关联关系:类与类之间的关系,有单向一对一和双向一对一,用实线箭头表示
- 泛化关系:其实就是继承关系,用实线三角表示
- 实现关系:通俗来说就是实现接口,用虚线三角表示
- 聚合关系:表示整体和部分的关系,他们之间可以相互分开,用是实线空心菱形表示
- 组合关系:表示整体和部分的关系,他们之间不可以相互分开,用是实线实心菱形表示
这六种关系的其他五种的本质都是依赖关系,我们可以细分成这六种
p.s. 所有代码和笔记均可在 我的GitHub 中获取,如果对您有帮助的话,可以点个 star 支持一下 ⭐