软件开发的内功修炼:数据结构、算法、设计模式、重构、软件工程
前言: 个人认为软件的演进过程或者说开发过程,在实际当中不一定非要使用很多的设计模式,就像 DDD 一样。 我理解的不管是设计模式也好还是 DDD 也好。其实都会带来一些问题,比如:类爆炸,过于抽象化的不好理解。 所以:没有绝对的银弹,只有合适的方案。
什么是设计模式? : 在特定的环境下,解决某类重复出现问题的一套成功/有效的解决方案。
整体总结介绍
UML 类图
UML 类图是什么
集百家之长的一坨构建模型的符号与标记的语言。
组成部分: (这部分仿佛在解释,什么是流程图,什么是泳道图,什么是结构图)
- 视图: 多个图,组合而成的抽象集合,包括不限于:(用户、行为、实现、环境)多个视图。
- 图:UML 2.0 提供了多种图,(用例、对象、包、组合结构、状态、活动、顺序、交互、通信)等等
- 模型元素: 用于表达
关系
。类、对象、消息、行为。(关联、依赖、泛化、调用)关系的一坨符号 - 通用机制:写一些备注,名称,便于更高效的理解
人话版本:通过一坨符号(空心方块,实心方块,虚线,实线,类,对象,组合,包含,关联)来构建成 视图
能干什么?解决了什么问题? 帮助人们,理解 一招一式
面向对象的七大原则
单一职责: 针对类/方法只做一件事,只做一个类型的事。强调的是最小单元,高内聚低耦合的系统。
开闭原则: 对新增开放,对修改关闭。满足开闭原则需要在程序上进行一些抽象设计。比如策略模式对 Ifelse 的优化。
里氏替换: 人话: 针对多态的情况,通过父类引用指向子类对象时,完全满足父类对象的 原始需求
,我喜欢一个动物,它是狗。但是我不喜欢老鼠这个动物。
依赖倒转: 抽象不应该依赖于细节,细节应该依赖于抽象。要针对接口编程,而不是针对实现编程。(Spring 的 DI 就是经典的应用代表)
接口隔离: 使用多个专门的接口,而不使用单一的总接口,客户端不应该依赖那些它不需要的接口。
合成复用: 少些 CV 操作,多些 ctrl
+ alt
+ m
的方法抽取。尽量使用对象组合来满足多项复用
迪米特: 人话:不要和陌生人说话,PO、DO、VO、QO
的经典应用。
创建的艺术
单例模式
- 单例模式的背景: 确保对象的唯一性,不管 CPU 上下文切换调度的任何操作,我能保证全局唯一,任何人看到的都是一样的。
- 单例模式的经典应用: windows 的任务管理器是不允许多开实例的。内容都是一样的,如果多开展示的都是重复内容,对系统的资源是一种浪费。
- 单例的优点: 全局唯一的实例访问、节约系统资源,允许可变数目的实例,可以扩展成多例类类似于线程池。
工厂模式
组合的艺术
交互的艺术
感悟和启发
个人粗浅的认为,这些所谓的设计模式,其实本质上都是针对面向对象思想的核心应用。
多思考,多实践,多说多做。
- 这个设计模式背后的意图是什么?
- 他要解决什么问题?他是怎么解决的?他的结构是怎样的?
- 我什么时候使用?
- 我需要记住什么关键信息? 如何联想生活中的 case和软件领域的 case 帮我更快的理解这个东西?
书中关联
volatile 关键字 : 针对双重检查锁, 通过 Volatile 来禁止指令重排序和保证线程可见性。JVM 针对 Volatle 会屏蔽 JVM 所做的一些代码优化,可能会导致系统运行效率的降低。因为不允许指令重排序,就是可能会导致效率降低。
摘抄
设计模式的学习难度与使用频率