概念
三要素: 继承、封装、多态
SOLID
五大设计原则S 单一职责原则
O 开放封闭原则
L 李氏置换原则
I 接口独立原则
D 依赖倒置原则
1 | class Car { |
new
操作单独封装new
操作(即初始化对象或者初始化实例单独封装),就要考虑是否使用工厂模式1 | // 汉堡包 (相当于 Product ) |
jQuery $(‘div’)
为什么是$('div')
而不是new $('div')
呢?
结合jQuery的源码,我们可以很清晰的看见这种工厂模式
1 | var jQuery = function(selector){ |
我们可以很清晰的看见,当我们使用jQuery或者($)去使用的时候,其实用的是new jQuery.fn.init(selector)
这个实例
这样写,无论实例的名字如何改变,jQuery可以不变,就像上文情景中,汉堡包的名字可以随意变,变成薯条等等,但是KFC不会变,我们只关心我们去KFC,而不用关心其他的。
React.createElement
在react里的jsx
1 | const profile = <div> |
在React.createElement
处理语法糖
1 | const profile = React.createElement("div", null, |
进入工厂模式
1 | class Vnode (tag, attrs, chilren){ |
我们统一使用React.createElement
来做收口,用户不需要关心我们使用的是什么构造函数
构造函数和创建者分离
符合开放封闭原则女
1 | class SingleObject { |
在jQuery中$
只有一个 (思想一致但是和Java的实现不一致)
vuex 和 redux 中的store
符合单一职责原则,只实例化唯一的对象
无法具体体现开放封闭原则,但绝不违反开放封闭原则
旧接口格式和使用者不兼容
中间加一个适配器兼容(类似手机转换头)
旧接口封装(自定义封装ajax)
插头和转换器的事例
1 | class Adaptee { |
$.ajax({...})
因为历史原因,在维护旧的代码的时候会出现很多$.ajax在这种使用jQuery的地方,但是我们想换成直接使用ajax({...})
这种形式。
原始
1 | $.ajax({ |
适配
1 | var $ = { |
vue 的 computed
1 | <body> |
效果图
将旧接口和开发者分离
符合开放封闭原则
1 | class Circle { |
科学上网
明星经纪人(明星与经纪人的关系)
1 | class RealImg { |
网页事件代理
1 | <body> |
效果图
jQuery的$.proxy
日常开发中,我们总会遇到this
的指向不是我们理想的对象的情况
1 | $('div').click(function () { |
多数情况我们是这样解决的
1 | $('div').click(function () { |
使用jQuery的proxy
1 | $('div').click(function () { |
ES6的Proxy
以明星和经纪人为例
1 | const star = { |
效果图:
代理类和目标类分离,隔离开目标类的使用者
符合开放封闭原则
发布 & 订阅
一对多(一对n)
点咖啡
订报纸、订牛奶
1 | class Subject { |
网页事件绑定
1 | <button id="btn">提交</button> |
Promise
1 | function loadImg (src){ |
jQuery callbacks
1 | var callbacks = $.Callbacks() |
nodejs自定义事件
1 | const fs = require('fs'); |
读取文件行
1 | const fs = require('fs'); |
其他case
vue 和 react 中的生命周期函数
vue watch
主题和观察者分离,不是主动触发而是被动监听,两者解耦
符合开放封闭原则
顺序访问一个集合
使用者无需知道集合内部的结构(封装)
1 | var arr = [1, 2, 3] |
jQuery each
ES6 Iterator
ES6 Iterator 是什么
实现ES6迭代器
1 | function each(data) { |
ES6
1 | function each(data) { |