23种设计模式和7大原则-开篇

23种设计模式和7大原则

本文旨在对设计模式做一个梳理,参考了书籍和博客,不求详尽,但求实用,在日常编码或源码阅读过程中,能够唤起“模式意识”

设计模式

设计模式(Design Pattern)是经过高度抽象化的在编程中可以反复使用的代码设计经验总结。

基本原则

单一职责原则

单一职责原则又称为单一功能原则,它规定一个类只有一个职责。如果有多个职责(功能)被设计在一个类中,这个类就违反了单一职责原则。

开闭原则

开闭原则规定了软件中的对象(类、模块、函数等)对扩展开放、对修改关闭,这意味着一个实体允许在不改变其源代码的前提下改变其行为。

里氏替换原则

里氏替换原则是对开闭原则的补充,规定了在任意父类可以出现的地方,子类都可以出现,实现开闭原则的关键就是抽象化,父类与子类的继承关系就是抽象化的具体表现,所以里氏替换原则是对实现抽象化的具体步骤的规范。

依赖倒置原则

依赖倒置原则是指程序要依赖于抽象(接口、抽象类),而不依赖于具体实现(实现类),基于抽象进行编程,不要求对实现进行编程,降低模块之间的耦合度。

接口隔离原则

接口隔离原则是指通过将不同的功能定义在不同的接口中来实现接口的隔离,这样就避免了其他类在依赖接口(接口上定义的功能)时依赖其它不需要的接口,可以减少接口之间依赖的冗余性和复杂性。

合成/聚合复用原则

合成/聚合的原则始指通过在一个新的对象引入(注入)已有的对象以达到类的功能复用和扩展目的,它的设计原则是尽量使用合成或聚合而不要使用继承来扩展类的功能。

迪米特法则

迪米特法则又叫做最小知道原则,指一个对象要尽可能少的与其他对象发生相互作用,也就是说一个对象对其他对象应该尽可能少的了解或依赖。其核心思想在于降低模块之间的耦合度,提高模块的内聚性。该原则可以让系统模块之间的功能独立,各个模块的运行更加简单,同时模块之间的组合变得更加容易。

模式分类

创建型(Creational Pattern)

提供许多优雅创建对象的方法。

结构型(Structural Pattern)

通过类和接口之间的继承和引用实现创建复杂结构对象的功能。

行为型(Behavioral Pattern)

通过类之间不同的通信方式实现不同的行为方式。

  • 责任链模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 备忘录模式(Memento Pattern)
  • 观察者模式(Observer Pattern)
  • 状态模式(State Pattern)
  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 访问者模式(Visitor Pattern)

UML类图中常见的6种关系

在学习设计模式之前,是很有必要了解下UML类图的基本概念,否则类图之间的箭头描述会让你晕头转向。

在UML类图中,常见的有以下几种关系:泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。

泛化(Generalization)

【泛化关系】:是一种继承关系,它指定了子类如何特化父类的所有特征和行为例如:老虎是动物的一种。

【箭头指向】:带三角箭头的实线,箭头指向父类。

img

泛化就是继承的关系,子类是可以知道自己的父类,而父类就不知道他的子类,所以,子类向上转型是OK的,而父类向下转向就不一定,需要确认是否发生过向上转型。

实现(Realization)

【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。

【箭头指向】:带三角箭头的虚线,箭头指向接口。

img

更多是描述扩展的功能或行为。

关联(Association)

【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子。关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

【代码体现】:成员变量。

【箭头及指向】:带普通箭头的实心线,指向被拥有者。

img

上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。

img

上图为自身关联:

关联关系是一种拥有关系,表现为一个类是另一个类对象的属性。

聚合(Aggregation)

【聚合关系】:是整体与部分的关系.如车和轮胎是整体和部分的关系。聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

【代码体现】:成员变量。

【箭头及指向】:带空心菱形的实心线,菱形指向整体。

img

聚合关系主要是描述整体与部分,二者生命周期可以不同,一群羊和一只羊,一只羊的生老病死并不影响整个羊群的生活。

组合(Composition)

【组合关系】:是整体与部分的关系.,没有公司就不存在部门 组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

【代码体现】:成员变量。

【箭头及指向】:带实心菱形的实线,菱形指向整体。

img

也是整体与部分关系,但是具有更强的关联关系,整体的生命周期和部分是绑定在一起。

依赖(Dependency)

【依赖关系】:是一种使用的关系,所以要尽量不使用双向的互相依赖。

【代码表现】:局部变量、方法的参数或者对静态方法的调用。

【箭头及指向】:带箭头的虚线,指向被使用者。

img

表现到类就是方法的参数或返回值。

总结

泛化= 实现> 组合>聚合> 关联> 依赖。

下面这张UML图,比较形象地展示了各种类图关系:

img

联想记忆:

关联和依赖:关联是很实际,所以纯实线箭头,而依赖呢,若即若离,若有若无,所以是虚线箭头。

组合和聚合:组合表达二者的生命周期一致,有很强的关系,所以黑色菱形箭头,而聚合,没那么强的关联,整体与个体生命周期可以不一致,所以白色菱形,同时白色菱形很像是容器,盛放了个体部分。

参考

https://www.cnblogs.com/feichengwulai/articles/3620106.html

https://www.cnblogs.com/zuoxiaolong/p/pattern26.html

https://honeypps.com/design_pattern

posted @ 2020-04-19 18:03  didi516  阅读(219)  评论(0编辑  收藏  举报