一、设计模式有哪些
标准的设计模式总共有23种,这些模式可以分为三大类,创建型、结构型和行为型,除了这23种外,还有其他如J2EE的设计模式(MVC等),这里只学习23中的常见的几种,结合Head First 设计模式和Java的一些框架源码进行深入学习,并通过ProcessOn画出UML图。
- 创建型:创建型主要提供了一种在创建对象时隐藏创建逻辑的方式,比如通常我们是通过new显式的创建对象,而创建型模式只提供了创建对象的方法,隐藏了创建对象的过程,能够更灵活的对对象的创建过程进行灵活扩展。主要有以下:
工厂模式单例模式- 抽象工厂模式
- 原型模式
- 建造者模式
- 结构型:结构型设计模式主要侧重于类和对象的组合,传统的继承可能会导致大量的类,让项目十分臃肿复杂和难以扩展,结构型的设计模式对对象进行抽象,并采用组合的方式,大大较少了类的数量,同时更灵活的扩展。
适配器模式外观模式装饰器模式代理模式- 桥接模式
- 过滤器模式
- 组合模式
- 享元模式
- 行为型模式:行为型模式主要侧重于对象间的通信
观察者模式命令模式状态模式迭代器模式模板模式策略模式- 责任链模式
- 解释器模式
- 中介者模式
- 备忘录模式
- 空对象模式
- 访问者模式
二、设计模式原则
六大原则:
开闭原则:对扩展开放,对修改关闭。里氏替换原则:任何基类可以出现的地方,子类一定可以出现。此原则保证子类可以替换基类而不影响原有功能,同时可以在基类的基础上增添行为。依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体。接口隔离原则:相对于单一的接口,使用多个隔离的接口会更好,强调降低依赖、降低耦合。迪米特法则(最少知道原则):一个实体应尽量少的与其他实体模块发生相互作用,使得系统功能模块相互独立。单一原则:一个类只负责一项职责,防止一个类负责多项职责,当其中有项需要修改的时候,影响到其他职责的运行。
单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
Head First的大白话设计原则:
- 找出程序中会变化的方面,然后将其与固定不变的方面相分离(隔离会变化的模块,并通过其他原则设计出弹性的、可灵活扩展的代码)。
- 针对接口编程,不针对实现编程(通过接口调用,而不是具体的实现调用)。
- 多用组合,少用继承。(尽量不通过继承获取某个功能,而是通过组合的方式,获取)
- ...
三、如何遵守六原则(引用)
对六原则的遵守不是是和否的问题,而是多和少的问题,也就是说,我们不会说有没有遵守,而是遵守程度的多少。任何事情都是过犹不及,设计模式的六原则也一样,制定六原则不是为了让我们刻板的遵守他们,而需要根据实际情况去灵活运用。对他们的遵守程度只要在合理范围内,就算良好的设计了,以下用图来描述下:
图中的每一条维度各代表一项原则,我们依据对这项原则的遵守程度在维度上画一个点,则如果对这项原则遵守的合理的话,这个点应该落在红色的同心圆内部;如果遵守的差,点将会在小圆内部;如果过度遵守,点将会落在大圆外部。一个良好的设计体现在图中,应该是六个顶点都在同心圆中的六边形。
在上图中,设计1、设计2属于良好的设计,他们对六项原则的遵守程度都在合理的范围内;设计3、设计4设计虽然有些不足,但也基本可以接受;设计5则严重不足,对各项原则都没有很好的遵守;而设计6则遵守过渡了,设计5和设计6都是迫切需要重构的设计。
四、总结
设计模式是很重要的一门技术,如果要提升自己的竞争力,往架构师方向走的话设计模式是必不可少的。目前的Java体系中大量运用了设计模式,如IO的装饰器模式、Spring IOC的工厂模式,单例模式、Spring MVC的适配器模式、Spring AOP的代理模式,适配器模式等等,学习设计模式可以帮助自己理解源码,相对的,学习设计模式时可以结合现有的Java体系中的设计模式,阅读其源码,结合实际应用学习,可以达到很好的学习效果。
参考: