什么是设计
- 按照某一种思路或者标准来实现功能
- 功能相同,可以用不同设计方案来实现
- 伴随着需求增加,设计的作用才能体现出来
推荐书籍
《UNIX/LINUX设计哲学》
- 准则01:小即是美
- 准则02:让每个程序只做好一件事
- 准则03:快速建立原型
- 准则04:舍弃高效率而取可移植性(复用性/通用性)
- 准则05:采用纯文本来存储数据
- 准则06:充分利用软件的杠杆效应
- 准则07:使用 shell 脚本来提高杠杆效应和可移植性
- 准则08:避免强制性的用户界面
- 准则09:让每个程序都称为过滤器
- 准则10:各部分之和大于整体
- 准则11:需求90%的解决方案
SOLID 五大设计原则
- S(single) - 单一职责原则
- O(open) - 开放封闭原则
- L - 李氏置换原则
- I - 接口独立原则
- D - 依赖导致原则
S -单一职责原则
- 一个程序只做好值做好一件事
- 如果功能过于复杂就拆分KIA,每个部分保持独立
O - 开放封闭原则
- 对拓展开放,对修改封闭
- 增加需求时,扩展新代码,而非修改已有代码
- 软件设计的终极目标
L - 李氏置换原则
- 子类能覆盖父类
- 父类能出现的地方子类就能出现
- JS中使用较少(弱类型 & 继承使用较少)
I - 接口独立原则
- 保持接口的单一独立,避免出现“胖接口”
- JS中没有接口(typescript)例外,使用较少
- 类似于单一职责原则,这里更关注接口
D - 依赖导致原则
- 面向接口编程,依赖于抽象而不依赖于具体
- 使用方只关注接口而不关注具体类的实现
- JS中使用较少
从设计到模式
创建型
- 工厂模式(工厂方法模式,抽象工厂模式,建造者模式)
- 单例模式
- 原型模式
组合型
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
行为型
- 策略模式
- 模板方法模式
- 观察者模式(重要)
- 迭代器模式(重要)
- 职责链模式
- 命令模式
- 备忘录模式
- 状态模式
- 访问者模式
- 中介者模式
- 解释器模式
工厂模式
将 new 操作单独封装,遇到 new 时,就要考虑是否该用工厂模式。
通过函数返回一个已经 new 生成的实例,不在外部创建实例。
为什么需要在内部创建实例
如果直接抛出未实例的对象,那么在创建实例时的一些验证及操作都需要使用者去执行;
设计原则验证
- 构造函数和创建者分离
- 符合开放封闭原则
模式案例
- jQuery - $('div')
- React.createElement
- Vue异步组件
单例模式
系统中被唯一使用,一个类只有一个实例
模式案例
- jQuery 只有一个 $
- Vuex 和 Redux 中的 store
- 登录框
- 购物车
设计原则验证
- 符合单一职责原则,只实例化唯一的对象
- 没法具体开放封闭原则,但是绝对不违反开放封闭原则
适配器模式
旧接口格式和使用者不兼容,中间加一个适配转换接口
装饰器模式
为对象添加新功能,不改变其原有的结构和功能
代理模式
使用者无权访问目标对象,中间加代理,通过代理做授权和控制
使用场景
- ES6 Proxy
代理模式 VS 适配器模式
- 【适配器模式】:提供一个不同的接口(如不同版本的接口)
- 【代理模式】:提供一模一样的接口,无权使用,但是又需要使用,所以加代理
代理模式 VS 装饰器模式
- 【装饰器模式】:拓展功能,原有功能不变且可直接使用
- 【代理模式】:显示原有功能,但是经过限制或者阉割之后的
外观模式
为子系统中的一组接口提供了一个高层接口,使用者使用这个高层接口
观察者模式
发布&订阅,一对多