设计模式

一、设计模式的目的

懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。

  1. 代码重用性(相同功能的代码不需要多次编写)
  2. 可读性(规范编程,便于其他开发人员阅读和理解)
  3. 可扩展性(当需要增加新功能的时候,非常方便)
  4. 可靠性(当我们增加新功能后,对原有的功能没有影响)
  5. 使程序呈现高内聚、低耦合的特性(高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合); 低耦合:减少类内部,一个成员方法调用另一个成员方法。)

二、设计模式的七大原则

​ 设计模式原则就是开发者在编程时应当遵守的原则,也是各种设计模式的基础(即:设计模式为什么这么设计的依据)。

  • 单一职责原则
  • 接口隔离原则
  • 依赖倒置原则
  • 里氏替换原则
  • 开闭原则
  • 迪米特法则
  • 合成复用原则

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 支持一下 ⭐

原文地址:https://www.cnblogs.com/songjilong/p/12397957.html