# 设计模式
# 设计模式
# 创建型
# 单例模式
定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。
何时使用: 一个全局的类频繁创建和销毁
例子:
- 创建菜单对象
- 弹窗
# 工厂模式
# 静态工厂模式
不暴露创建对象的具体逻辑而是将逻辑进行封装,由一个工厂对象决定创建某一个类的实例。
# 抽象工厂模式
通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一个类产品的实例。
# 建造者模式
# 结构型
# 代理模式
定义:为一个对象提供一个代用品或占位符,以便控制对它的访问。
何时使用:某一个花销很大的操作,可以通过虚拟代理的方式延迟到这种需要它的时候才去创建。
例子:图片懒加载
图片懒加载的方式:先通过一张loading图占位,然后通过异步的方式加载图片,等图片加载好了再把完成的图片加载到img标签里面。
# 适配器模式
适配器模式的目的是为了解决对象之间的接口不兼容的问题,通过适配器模式可以不更改源代码的情况下,让两个原本不兼容的对象在调用时正常工作。
# 装饰器模式
装饰者模式能够在不更改源代码自身的情况下,对其进行职责添加。装饰器模式是继承的一个替代模式,它可以动态的扩展一个实现类的功能。
例子:
在编写飞机大战的游戏中,飞机对象的攻击方式只有普通子弹攻击,如何在不更改原代码的情况下,为它其他的攻击方式,如激光武器,导弹武器?
class Aircraft {
ordinary(){
console.log('发射普通子弹')
}
}
class AircraftDecorator {
constructor(aircraft){
this.aircraft = aircraft
}
laser(){
console.log('发射激光')
}
guidedMissile(){
console.log('发射导弹')
}
ordinary(){
this.aircraft.ordinary()
}
}
const aircraft = new Aircraft()
const aircraftDecorator = new AircraftDecorator(aircraft)
aircraftDecorator.ordinary() // 发射普通子弹
aircraftDecorator.laser() // 发射激光
aircraftDecorator.guidedMissile() // 发射导弹
# 享元模式
# 组合模式
# 行为型
# 策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式的目的是,将算法的使用与算法的实现分离开来。
# 发布订阅模式
定义对象之间的1对N的依赖关系,当其中一个对象发生变化时,所有依赖于它的对象都会得到通知。
# 迭代器模式
# 命令模式
# 状态模式
# 中介者模式
# 职责链模式
# 模板方法模式
# 设计的原则
# 单一职责原则
一个程序只需要做好一件事。如果功能过于复杂就拆分开,保证每个部分的独立。
# 最少知识原则
面向接口编程,依赖于抽象而不依赖于具体。使用方只专注接口而不用关注具体类的实现。
# 开放-封闭原则
对扩展开放,对修改封闭。增加需求时,扩展新代码,而不是修改源代码。