(TODO)设计模式在前端开发中的应用

菜鸟教程里面,把设计模式看一遍先

https://www.runoob.com/design-pattern/design-pattern-tutorial.html

mindmap
  root((设计模式))
    创建型
      类
        工厂方法
      对象
        抽象工厂
        建造者
        原型
        单例
    结构型
      类
        适配器(类)
      对象
        适配器(对象)
        桥接
        组合
        装饰
        外观
        享元
        代理
    行为型
      类
        模板方法
        解释器
      对象
        策略
        状态
        观察者
        迭代器
        责任链
        命令
        备忘录
        中介者
        访问者

单例

闭包实现单例

export default a

编译的时候会形成一个闭包,可以分析下编译过程

我之前用组件,想通过单例保存数据,也是这个原理

工厂模式

组件的注册机制用到了,通过组件名称(ClassName),获取组件实例

这次的装饰器是不是也可以用工厂?

抽象工厂和工厂的区别是什么?

责任链模式

洋葱圈模型

区别于拦截过滤器

感觉就是任务队列机制,grunt类似

短视频后端处理,很适合用责任链模式;目前是用链式调用实现的

过滤器模式

webpack loader

观察者模式

订阅发布模式

观察者模式和订阅发布模式的区别

订阅发布的耦合度,比观察者低,因为有个中介代理

装饰器模式

增强XX的能力

prototype扩展,比如蔡东实现个性化的可视化需求

增强的是行为还是表现?还是属性(prototype)

装饰器和继承重写方法的区别是什么?保有原来能力的情况下,增强新功能。

流程:

1、先用一个变量保存原来的方法

2、重写类的方法

3、在新的方法最后调用重写前的方法

1、继承的方式扩展

2、组合的方式

传入一个定位信息,每一个tick绘制一下;自定义图形的方式实现?

通过每一个插值的回调来实现个性化的效果!!!!牛逼了这个

错误的案例:动态条形图的增强

动态条形图,每一行其实包括了好几个元素:排名、名称、柱子、logo、数值。看起来似乎可以用装饰器模式,但是柱状图的场景,是包含了增强+独立操控的,后者不适合装饰器,装饰器是一锤子买卖,只有一个子组件。

装饰器模式不好在后续操作中,针对具体的小元素进行操作。比如修改value的数值。

这种场景,应该采用下面的组合模式。

组合模式

https://refactoringguru.cn/design-patterns/composite

适用于每个子组件有自己的行为或者属性,需要针对子组件细粒度操控的场景。

当你的场景包含如下几个特性,就可以考虑组合模式了:

  • 树状结构(层级结构)
  • 需要对子组件进行细粒度的操控和交互

这在3D游戏开发中,也经常用到,比如物体的位置信息,通过构建树状结构,然后以层层本地坐标转换的方式,最终算出每个物体的世界坐标。

案例:动态条形图的增强

动态条形图,每一行包括了好几个元素:排名、名称、柱子、logo、数值。

可以这样设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Widget<W:Widget>{
protected _widget: W | null;
constructor() {
_widget = widget;
}

render() {

}
}

class Bar extends Widget {
constructor(widget: Widget) {
_widget = widget;
}
render() {
this._widget.render();
// DO SOMETHING
}
}

class Rank extends Widget {
render() {
this._widget.render();
// DO SOMETHING
}
}

const bar = new Bar();

const rank = new Rank(bar);

备忘录模式

撤销、回退:数据结构用链表

状态管理

动态柱状图的用户操作的处理:数据结构用数组

建造者模式

解决模板的差异化需求

和组合模式有什么区别?

原型继承的原理:

1、拷贝原型

2、将非原型的方法附加上去

键值对还是数组?

O(1)和O(n)的区别

一般会把用户传入的先处理下,做个键值对缓存,如果用户经常有查询操作的话

1、键值对和数组的应用

2、队列的应用

3、装饰器的应用

资料

工作中的23个设计模式:

https://zhuanlan.zhihu.com/p/584199781

前端需要了解的9种设计模式:

https://zhuanlan.zhihu.com/p/133263261

前端和设计模式:

https://zhuanlan.zhihu.com/p/56436085