1. 前言
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
设计模式 ------这四个字不仅仅是一个通用技能的名称,更是考验一名开发工程师的基本功以及个人对于面向对象编程语言的理解有多深刻。都说面向对象编程语言,那么何为面向对象?如何能写出优雅、整洁、易阅读的代码呢...等等问题,可能最后都能总结到设计模式 这四个字。之所以把上一篇面向对象的SOLID原则作为我的架构师之路第一篇文章,也是为了引出接下来架构师之路第一个系列------设计模式。
大家都在说阅读框架源码,那么相信大家在未学习设计模式之前,阅读源码也是一头雾水,甚至不明白为什么源码的作者,如Spring开发team,为何要把一个功能设计的如此复杂,为什么代码逻辑被拆散至多个不同的类呢?这些奥义也都隐含在设计模式当中。
2. 设计模式总览
在设计模式的学习中,我们避免在面试中死记硬背一些设计模式,我们需要对这些设计模式进行分类学习,这样也便于我们学习的更加牢固。
2.1 创建型模式(Creational Patterns)
所谓的创建型模式,就是一个对象(或者说一个实例)在创建过程中所采用的设计,一般是处于一个类的生命周期最初阶段,相对于其他两种情况相对于简单明了。这类模式主要是对于整个程序系统中如何按照设计要求生成这个类的实现。
- 单例模式(Singleton)
- 原型模式(Prototype)
- 工厂模式(Factory)
- 建造者模式(Builder)
2.2 结构型模式(Structural Patterns)
结构型模式在我的理解中,偏向于多个类进行如何组合的设计,多个类是通过继承还是组合的关系来实现更加具有拓展性的功能。
- 代理模式(Proxy)
- 适配器模式(Adapter)
- 桥接模式(Bridge)
- 装饰模式(Decorator)
- 门面模式(Facade)
- 享元模式(Flyweight)
- 组合模式(Composite)
- 过滤器模式(Filter)
2.3 行为型模式(Behavioral Patterns)
行为型模式在设计模式中侧重点在于类在工作中是如何进行协调与分配的,相对于其他两种更加考验在具体业务场景下面对的不同要求所进行设计,难度系数可能是较难的类型,但是在优秀的代码设计中,这部分往往是更重要的。
- 模板方法模式(Template Method)
- 策略模式(Strategy)
- 命令模式(Command)
- 责任链模式(Chain of Responsibility)
- 状态模式(State)
- 观察者模式(Observer)
- 中介者模式(Mediator)
- 迭代器模式(Iterator)
- 访问者模式(Visitor)
- 备忘录模式(Memento)
- 解释器模式(Interpreter)
3. 组件的生命周期

4. 设计的7大原则
4.1 开闭原则(Open Closed Principle, OCP)
软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification)
合成复用原则、里氏替换原则相辅相成,都是开闭原则的具体实现规范
4.2 里氏替换原则(Liskov Substitution Principle, LSP)
继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)
4.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)
4.4 单一职责原则(Single Responsibility Principle, SRP)
一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)
4.5 接口隔离原则(Interface Segregation Principle, ISP)
一个类对另一个类的依赖应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)
4.6 迪米特法则(Law of Demeter, LoD)
最少知识原则(Least Knowledge Principle,LKP) 只与你的直接朋友交谈,不跟"陌生人"说话(Talk only to your immediate friends and not to strangers)
4.7 合成服用原则(Composite Reuse Principle, CRP)
又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP) 软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
结语
在此声明,我是一名24届毕业的计算机专业本科生,学习Java开发已有三年之久,但是实际企业级开发经验仍旧不足,我所写下的内容都是我自己学习过程中经验的总结,也是想记录自己实现梦想一步步的脚印。如若在文章中存在漏洞,烦请您能够给予指正。联系邮箱1091177158@qq.com。后续我会持续更新每一种设计模式的具体实现方式以及应用场景。