一、模式定义
模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。
数据结构、算法、设计模式、重构、软件工程是内功
模式之父把这些认同规律归纳为253个模式,对每一个模式(Pattern)都从 Context(前提条件)、Theme或Problem(目标问题)、 Solution(解决方案)三个方面进行 了描述,并给出了从用户需求分析到建筑环境结构设计直至经典实例的过程模型。
软件模 式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等.
软件模式的基础结构主要由 四部分构成,包括问题描述【待解决的问题是什么】、前提条件【在何种环境或约束条件下 使用】、解法【如何解决】和效果【有哪些优缺点】
问题 (Problem)描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因;解 决方案(Solution)描述了一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自 的职责和协作方式,通常解决方案通过UML类图和核心代码来进行描述;效果(Consequences) 描述了模式的优缺点以及在使用模式时应权衡的问题。
根据它们的用途,设计模式可分为创建型(Creational),结构型(Structural)和 行为型(Behavioral)三种,其中创建型模式主要用于描述如何创建对象,结构型模式主要用于 描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎样交互以及怎样分配职责
目标:向前要兼容、当前稳定、未来可扩展
具体目标:低耦合、高内聚、可复用、易扩展
二、设计模式至少有如下几个用途
- 设计模式无疑会为有助于我们提高开发和设计效率
- 一种通用的形式来方便开发人员之间沟通和交流
- 设计模式都兼顾了系统的可重用性和可扩展性
- 有主语初学者,如何将代码 分散在几个不同的类中?为什么要有“接口”?何谓针对抽象编程?何时不应该使用继承?如果 不修改源代码增加新功能?
1、学习方法
在学习每一个设计模式时至少应该掌握如下几点:这个设计模式的意图是什么,它要解决 一个什么问题,什么时候可以使用它;它是如何解决的,掌握它的结构图,记住它的关键代 码;能够想到至少两个它的应用实例,一个生活中的,一个软件中的;这个模式的优缺点是 什么,在使用时要注意什么。当你能够回答上述所有问题时,恭喜你,你了解一个设计模式 了,至于掌握它,那就在开发中去使用吧,用多了你自然就掌握了。
面向对象设计原则
XXX模式违反了XXX原则
设计原则名称
- 单一职责原则 (Single Responsibility Principle, SRP) 定义 一个类只负责一个功能领域中的相应职责
- 开闭原则 (Open-Closed Principle, OCP) 软件实体应对扩展开放,而对修改关闭
- 里氏代换原则 (Liskov Substitution Principle, LSP) 所有引用基类对象的地方能够透明地使用其子类的对象
- 依赖倒转原则 (Dependence Inversion Principle, DIP) 抽象不应该依赖于细节,细节应该依赖于抽象
- 接口隔离原则 (Interface Segregation Principle, ISP) 使用多个专门的接口,而不使用单一的总接口
- 合成复用原则 (Composite Reuse Principle, CRP) 尽量使用对象组合,而不是继承来达到复用的目的
- 迪米特法则 (Law of Demeter, LoD) 一个软件实体应当尽可能少地与其他实体发生相互作用
单一职责
单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法) 承担的职责越多,被复用性越小,相当于将这些 职责耦合在一起,当其中一个职责变化时,影响其他职责的运作,因此要分离职责,不同职责封装在不同的类、方法中。单一职责原则是实现高内聚、低耦合的指导方针
拆分为多个方法、拆分为多个类 两个角度完成单一
案例:Service中融合了 初始化、工作流程、Service状态管理。状态影响工作流程、初始化。初始化对象的生命周期不同,有和Service同周期,也有和工作流同周期的。管理容易混乱。
开闭原则
开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件 实体应尽量在不修改原有代码的情况下进行扩展。通过定义抽象类,利用多态特性,实现新增业务处理时,不改动顶层代码,达到开闭原则的要求。 随着时间推移、新业务开发,是 系统稳定性的 保障。,命令模式?
里氏替换
装饰器模式
Okio、RxJava、JavaIO流操作 一层层包装的过程
代理模式
代理,给人的感觉是不能被层层包装多次