概述
OOP(Object Orient Programming)面向对象编程;
三大特征:
- 封装,将功能封装进相对独立的模块;
- 多态,同一接口、类型,却可以做不同的事,代表不同的涵义;
- 继承,属性、方法可被继承或扩展;
注1:JS是一种多范式语言,支持面向对象的编程思想,其原型模型中,多态体现在:实例本身的属性或方法的优先级高于其原型对象上的同名属性或方法;
注2:根据Wikipedia的词条定义,多态并非OOP独有,分为
- 特设多态:函数重载、运算符重载;
- 参数多态:泛型编程;
- 子类型多态:父类型可替代子类型;
七大设计原则(SOLIDDC):
- Single Responsibility 单一职责,一个模块只做一件事;
- OpenClosed 开闭原则,对扩展开放,对修改封闭;
- Liskov Substitution 里氏替换,子类能覆盖父类;
- Interface Segregation 接口隔离,保持接口的单一且独立;
- Dependency Inversion 依赖倒置,依赖于抽象而非具体;
- Demeter 迪米特原则,类间解耦,减少对其他类的依赖;
- Composite Reuse 合成复用,优先通过合成(聚合、组合)实现复用;
注:聚合、组合是两种关联关系,描述的对象是整体与部分——前者强调部分可以独立存在,例如大雁与雁群就是一种聚合关系;后者强调部分无法独立存在,例如翅膀与大雁;
23种设计模式:
- 创建型:
- 单例模式;
- 原型模式;
- 工厂模式;
- 建造者模式;
- 结构型:
- 适配器模式;
- 装饰器模式;
- 代理模式;
- 外观模式;
- 桥接模式;
- 组合模式;
- 享元模式;
- 行为型:
- 观察者模式;
- 迭代器模式;
- 策略模式;
- 模板方法模式;
- 职责链模式;
- 命令模式;
- 备忘录模式;
- 状态模式;
- 访问者模式;
- 中介者模式;
- 解释器模式;
单例模式
单一实例,即保证一个类只有一个实例,为该实例提供一个全局访问点;
应用场景:
- redux的状态树;
- 网站访问计数器;
实现方式:
- 饿汉式,开始就创建实例;
- 懒汉式,用到再创建实例;
工厂模式
调用者不直接创建对象,而是通过工厂来获得指定对象,调用者与创建者分离,降低耦合度;
三种工厂模式:
- 简单工厂,即完全由工厂创建各类对象,调用者不需要知道具体创建逻辑,工厂类职责较重;
- 工厂方法,工厂接口预先规范好创建对象的方法,由实现该工厂接口的类负责创建对象;
- 抽象工厂,创建工厂的工厂,可以分为总工厂、工厂和产品,总工厂决定创建哪些工厂,工厂决定创建哪些产品,这两者单独看都属于工厂模式,合起来称之为抽象工厂;
代理模式
不直接访问目标对象,而是通过代理对象间接地访问目标对象,在此过程中,代理对象可以在访问目标对象之前或之后添加逻辑,而不必直接修改目标对象;
建造者模式
用于拆分复杂对象的创建逻辑,并以一定顺序组装起来,分为四种角色:
- Builder,将复杂对象的创建逻辑拆分为若干个方法,Builder以接口形式存在,主要作用是方法及属性的规范化;
- ConcreteBuilder,是Builder的实现;
- Director,只负责将ConcreteBuilder的各类方法按指定顺序调用,并返回Product;
- Product,即复杂对象本身;
模板方法
对于多个相似但不完全一样的业务逻辑,保留共有的部分,在模板类中实现,变化的部分由继承模板类的子类实现;
外观模式(门面模式)
将多个接口的调用逻辑封装起来,并对外界提供一个统一接口调用该逻辑;
原型模式
对于初始化开销大的对象,通过克隆已有对象(即原型)来减少开销;或者用于保护性拷贝;
注:保护性拷贝,即不直接修改原对象属性,而是复制出一个对象,修改该克隆对象,并让指向原对象的指针指向克隆对象,这种模式也称为不可变对象;
两种实现方式:
- 浅拷贝,只拷贝一层,引用类型直接拷贝地址;
- 深拷贝,拷贝所有层级的属性,引用类型会创建一个新对象,并复制原对象的属性值;
策略模式
对于一组功能相近但实现不同的操作,将其各自封装起来,对外提供一组相同的接口,外界可以根据需要去替换接口;
应用场景:支付模块的支付方式选择、各类会员的适用权益等;
注:模板方法强调的是子流程的替换,策略模式强调的是整个流程的替换;
观察者模式(发布-订阅模式)
一个对象发生改变时,通知相关对象,以便相关对象采取对应操作;
两种角色:
- Observer,实现一个update方法,供Subject调用;
- Subject,维护一个Observer数组,以便稍后挨个调用其update方法,还要提供一对subscribe/unsubscribe方法,以便将Observer从数组中添加或移除;