有七种设计规范或原则,有二十三种设计模式。设计模式并不是完全满足设计规范的甚至有的是冲突的,有些设计模式可能有很多方面类似但是有一方抽象概念不同也会归为两类设计模式。
为了深入理解设计模式,需要一种辅助工具或者说是一种语言表达方式,叫UML(Unified Modeling Language),要懂得什么是对象图什么是时序图。
Java源码很难阅读一是对数据结构不敏感,很多C语言的数据结构支撑着Java设计模式,二是对设计模式不敏感,看了一圈却不知道终点和起点。

一、设计模式

1、设计模式的前世今生

1994年,由四位国外大佬GOF出版了一本书叫 Design Patterns - Elements of Reusable Object-Oriented Software(设计模式 - 可复用的面向对象软件元素),总结为对接口编程而不是对实现编程优先使用对象组合而不是继承
设计模式可分为三大类型,创建型模式(Creational Patterns),结构型模式(Structural Patterns),行为型模式(Behavior Patterns)。
他们的作用分别用于如何描述创建对象,如何实现类或对象的组合,和类和对象如何交互。
同时对应了组件的生命周期。
image.png
具体细分如下:
image.png
设计模式重在思想,学会灵活应用,等到忘记太极拳有多少招式的境界才算灵活应用。

2、设计模式的7大原则

2.1 开闭原则(Open Closed Principle,OCP)

软件实体应当对扩展开放对修改关闭
(Software entities should be open for extension,but closed for modification)
合成复用原则、里氏替换原则相辅相成,都是开闭原则的具体实现规范
总结来说扩展新类而不是修改旧类

2.2 里氏替换原则(Liskov Substitution Principle,LSP)

继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)
总结:继承父类而不是改变父类

2.3 依赖倒置原则(Dependence Inversion Principle,DIP)

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)
总结:面向接口编程而不是面向实现类

2.4 单一职责原则(Single Responsibility Principle,SRP)

一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)
总结:每个类只负责自己的事情,而不是变成万能

2.5 接口隔离原则(Interface Segregation Principle,ISP)

一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。
总结:各个类建立自己的专用接口,而不是建立万能接口

2.6 迪米特法则(Law of Demeter,LoD)最少知识原则(Least Knowledge Principle,LKP)

只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)
总结:无需直接交互的两个类,如果需要交互,使用中间者
同时过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。

2.7 合成复用原则(Composite Reuse Principle,CRP)组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)

软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
总结:优先组合其次继承

3、创建型模式

单例模式

飞飞暗恋的女神暂时只有一位,而且暗恋了很多年了,同事同学中只要说女神就知道是谁了,飞飞还是个幻想狂,总是将女神的一举一动挂在嘴边,久而久之同事同学中就统一对女神有了两种认识,一种是暗示效应很多人和飞飞一样喜欢上了女神,另一种是嫉妒心理,恶心嫉妒和破坏。
这里的女神就是单例,两批人对女神的看法就是单例拥有的方法,uml类图如下:
image-1653984286363
这是饿汉式,缺点是占用内存。让飞飞二十四小时保持幻想状态人会疯掉。调用方如飞飞会调用女神实例的like()方法,反感的一方会调用hate()方法。

工厂模式

4、结构型模式

5、行为型模式

二、设计模式在各大框架源码中的体现

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议