前言
设计模式应该分为“设计”和“模式”两部分来学习。首页是设计原则,然后是再从设计到模式。因为设计模式都是基于面向对象的,所以需要先了解一下面向对象。
一、面向对象
1.1、面向对象的概念
面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。
ES5使用构造函数(constructor)作为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。ES6引入了 Class(类)这个概念,作为对象的模板。
1.2、面向对象三要素
继承:子类继承父类
- 父类是公共的,不仅仅服务于某个子类。
- 继承可将公共方法抽离出来,提高复用,减少冗余。
封装:数据的权限和保密
在真正的面向对象语言(如:C++和Java)中,可以使用以下三个关键字来定义属性或方法
- public完全开放
- protected对子类开放
- private对自己开放
这三个用于定义属性和方法 ES6尚不支持,typescript支持。
- 减少耦合,不该外露的不外露
- 利于数据、接口的权限管理
- ES6 目前不支持,一般认为
_开头的属性是private
多态:同一接口不同实现
JS应用很少,需要结合java等语言的接口、重写、重载等功能。
二、设计原则
2.1、通过《LINUX/UNIX设计哲学》理解何为设计
设计准则
- 小即是美
- 让每个程序只做好一件事
- 快速建立原型
- 舍弃高效率而取可移植性
- 采取纯文本来存储数据
- 充分利用软件的杠杆效应(软件复用)
- 使用shell 脚本来提高杠杆效应和可移植性
- 避免强制性的用户界面
- 让每个程序都称为过滤器
小准则
- 允许用户定制环境
- 尽量使操作系统内核小而轻量化
- 使用小写字母并尽量简短
- 沉默是金
- 各部分之和大于整体
- 寻求90%的解决方案(重要)
2.2、SOLID五大设计原则
-
S - 单一职责原则 一个程序只做一件事,如果功能过去复杂就拆分开,每个部分保持独立
-
O - 开放封闭原则 对扩展开放,对修改封闭。增加需求时,扩展新代码,而非修改已有代码。这是软件设计的终极目标。
-
L - 李氏置换原则 子类能覆盖父类,父类能出现的地方子类就能出现。JS中使用较少(弱类型&继承使用较少)。
-
I - 接口独立原则 保持接口的单一独立,避免出现“胖接口”,JS中没有接口(除typescript),使用较少。类似于单一职责原则,这里更关注接口。
-
D - 依赖倒置原则 面向接口编程,依赖于抽象而不依赖于具体。使用方只关注接口而不关注具体类的实现。JS中使用较少(没有接口&弱类型)。
三、设计模式
“设计”和“模式”应该分开来看,从设计到模式。
23种设计模式
-
创建型 工厂模式(工厂方法模式、抽象工厂模式、建造者模式)、单例模式、原型模式
-
组合型 适配器、装饰器、代理、外观、桥接、组合、享元
-
行为型 策略、模板方法、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者、解释器