刚考完Java设计模式,趁热打铁留下篇博客方便以后查阅和理解。
课程书籍是《Java设计模式》,刘伟编著。
面向对象设计原则
面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则,但并不是强制性的。
最常见的7个面向对象设计原则:
设计原则名称 | 定义 | 理解或实践 |
---|---|---|
单一职责原则 | 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 | 单一职责原则是实现高内聚,低耦合的指导方针。 |
开闭原则 | 软件实体应当对扩展开放,对修改关闭。 | 抽象化是开闭原则的关键。 |
里式代换原则 | 所有引用基类的地方必须能透明地使用其子类的对象。 | 在程序中尽量使用基类类型来定义对象。 |
依赖倒转原则 | 高层模块不应该依赖底层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象 | 针对接口编程,不要针对实现编程。有依赖必有抽象(接口)说法的来源。 |
接口隔离原则 | 客户端不应该依赖那些它不需要的接口。 | 提供尽可能小的单独的接口,而不要提供大的总接口。 |
合成复用原则 | 优先使用对象组合,而不是通过继承来达到复用的目的。 | 成员对象方式(黑箱复用)相对于继承(白箱复用)而言,耦合度更低。一个“has-A”,一个“is-A” |
迪米特法则 | 每一个软件单位对其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。 | 一个软件实体应该尽可能少的与其他实体发生相互作用。 |
在软件开发中使用面向对象设计原则可以提高软件的可维护性和可复用性,以便设计出兼具良好的维护性和可复用性的软件系统,实现可维护性复用的目标。
设计模式分类
1.根据目的分类:
类型 | 模式 | 目的 |
---|---|---|
创建型 | 工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式 | 主要用于创建对象。 |
结构型 | 适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式 | 主要用于处理类或对象的组合。 |
行为型 | 职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式 | 主要用于描述类或对象怎样交互和怎样分配职责。 |
2.根据范围分类
类模式和对象模式
创建型设计模式
目的:用于创建对象
0.简单(静态)工厂模式(非23种设计模式中的一种):通常也就是一个Factory类,一个get对象的static方法。
1.工厂方法模式:比简单工厂模式多了个抽象层,也就没有了static修饰get对象的方法。
2.抽象工厂模式:角色和结构都和工厂方法模式类似。
工厂方法模式和抽象工厂模式的区别:
工厂方法模式: 只有一个抽象产品类,具体工厂类只能创建一个具体产品类的实例
抽象工厂模式: 有多个抽象产品类 ,具体工厂类能创建多个具体产品类的实例
3.建造者模式
- 目的:创建复杂对象。
- 角色:抽象建造者、具体建造者、产品、指挥者
- 逻辑:指挥者指挥建造者(指挥者对象维护了建造者对象),建造者确定怎样建造产品(建造者对象维护了产品对象)。最终客户端通过指挥者对象传入的具体建造者对象来获取产品对象。
- 好处:屏蔽和分离了复杂对象的具体构建过程(封装在具体建造者中)。
4.原型模式
- 目的:创建类似对象
- 浅克隆:对象内的引用类型成员不会克隆。Java的Cloneable接口和clone方法
- 深克隆:对象内的引用类型成员也会克隆。Java的Serializable接口+序列化技术
5.单例模式
- 目的:创建唯一性的对象
- 步骤:私有化成员变量、私有化构造函数、提供公有方法获取对象
- 饿汉单例模式:不能实现延迟加载,始终占用内存
- 懒汉单例模式:延迟加载,但安全控制繁琐(代码块锁+双重判断处理线程安全问题),性能受影响。
- 静态内部类方式:延迟加载、线程安全、不影响系统性能。
结构型设计模式
目的:处理类或对象之间的组合。
1.适配器模式
- 类比生活:适配器对象指电脑,适配者对象就是各种外设
- A:适配器对象
- B:适配者对象
- 使用逻辑:以适配器为核心,指定适配者,面向适配器对象操作即可。(适配器内部转发调用适配者的方法)
2.桥接模式
- 类比生活:扩充对象是指各种笔,实现对象就是指各种纸
- A:实现对象(纸对象)
- B:扩展对象(笔对象)
- 使用逻辑:同适配器模式。不一样的是,这里B对象的引用使用基类类型来定义对象,可接受不同的实现类,实现定制效果。
其实对比适配器模式不难发现,如果适配者对象也是有抽象层并使用基类类型对象定义,那么和桥接模式的表现基本一致了。
3.组合模式(部分-整体模式)
- 类比生活:叶子构件指文件,容器构件就是文件夹。
- C:最外层容器
- A1、A2、A3:都是最外层容器内的叶子或容器组件
- 使用逻辑:以容器对象为核心,面向容器操作,添加删除获取元素对象以及容器的整体行为。
- 使用场景:组合模式有容器概念,侧重容器的整体行为或者对容器内元素的统一处理
4.外观模式
- C:外观角色
- A、B、C:子系统角色
- 使用逻辑:以外观对象为核心,外观对象的方法内部转发调用了各子系统角色方法。
5.享元模式
- 概念:运用共享技术有效地支持大量细粒度对象的复用。
- C:享元工厂
- a、b、c:不同享元类的对象
与组合模式的比较:
组合模式关注容器,凸显容器和元素的整体行为,内部元素对象的类通常有共性抽取出抽象层,所以图示里使用A1、A2等表示。
享元模式关注元素,侧重元素对象的共享,元素对象的获取,所以图示使用小写的abc表示。
6.装饰者模式
- A:指被装饰的对象
- D1、D2、D3:都指装饰类对象
- 使用逻辑:关注核心始终都是被装饰对象A,外部装饰对象只是对内部装饰对象或原对象A已有的成员变量和方法做边缘处理或者添加新的方法,是增强对象的一种方式。
7.代理模式
- 种类:静态代理、远程代理、虚拟代理、动态代理
- P:代理对象
- A:被代理对象
- u1、u2都是代理对象用到的工具对象,如身份验证对象、日志记录对象。
- 使用逻辑:代理对象使用工具对象对被代理对象已有的成员变量和方法做边缘处理或者添加新的方法,是增强对象的一种方式。
行为型设计模式
目的:描述类或对象怎样交互和怎样分配职责。
此类模式都应使用类的结构图来描绘,方便理解,这里先偷个懒留个坑,待更新。
1.职责链模式
- A0:抽象处理者
- An(n=1,2,3,4,…):具体处理者
- 关键部分:setSuccesstor(指定当前职责对象的下一职责对象)、handleRequest(当前职责业务代码,以及判断是否跳转到下一职责对象)
结构图:
待更新
2.命令模式
待更新
3.解释器模式
4.迭代器模式
5.中介者模式
6.备忘录模式
7.观察者模式
8.状态模式
9.策略模式
10.模板方法模式
11.访问者模式
博主此时大三,水平有限,如有错误,尽请指正。