什么是设计模式
设计模式就是一种思想,用来规范编程的代码的,让代码 更整洁 清晰 维护 扩展等等。
1.单例设计模式和命令模式
是早期的模块化编程,历史:
AMD(require.js)
CMD(sea.js)/common.js(node)
ES6 module
用于业务逻辑处理
思想:基于单独的实例,来管理一个模块的内容,实现模块之间的独立划分,以及模块之间方法的相互调用。
单例模式就是暴露方法,命令模式是控制这些方法谁先执行,谁后执行。
let SearchModule = (function () {
let body = document.body;
function queryData() {}
function bindHTML() {}
function handle() {}
return {
// init相当于大脑,可以控制谁先执行,谁后执行 (这就是命令模式)
init: function () {
queryData();
bindHTML();
handle();
}
};
})();
SearchModule.init();
但是单例没法满足这种诉求:单独的私有的容器,执行的方法还是同一个,但是每一次修改都是改自己的容器里面的变量,于是出现了constructor构造器模式。
2. constructor构造器模式
构造器可以创造一大类,很多实例,每一个实例都有自己私有的方法和属性,同时可以通过prototype来添加公有的属性和方法
类&实例
私有&公有属性方法
插件组件封装
AModule:类「构造函数」
class AModule {
constructor() {
// this->每个类的实例
this.arr = [];
}
// 原型上 公共的属性和方法
change(val) {
this.arr.push(val);
console.log(this.arr);
}
}
let A1 = new AModule;
let A2 = new AModule;
console.log(A1, A2);
console.log(A1 === A2); //->false
console.log(A1.arr === A2.arr); //->false
console.log(A1.change === A2.change); //->true
A1.change(10);
A2.change(20);
3.factory mode工厂模式
项目:一个产品 调用数据库,根据量级或者需求等不同的因素,我们需要让产品切换调用到不同的数据库中 oracle sqlserver mysql -> DB层,根据逻辑或者标识,能切换连接的数据库
工厂模式:工厂可以帮助我们实现调用的切换,或者实现一些中转的处理。
简单的工厂模式
function factory(options) {
options = options || {};
let {
type,
payload
} = options;
if (type === 'array') {
// 执行A,完成一个逻辑
return;
}
// 执行B,完成另外的逻辑
}
factory({
type: 'array',
payload: 100
});
factory({
type: 'object',
payload: 'candy'
});
jq中的工厂模式
(function () {
var jQuery = function (selector, context) {
// 创建init类的实例
return new jQuery.fn.init(selector, context);
};
jQuery.fn = jQuery.prototype = {
// ...
};
// 需要工厂的转换
var init = jQuery.fn.init = function (selector, context, root) {};
init.prototype = jQuery.fn;
window.$ = jQuery;
})();
$('xxx'); //-> jQuery('xxx') 创建JQ类的实例,调取jQuery.fn原型上的方法
4.Observer观察者模式
观察者一定要有update方法,目标可以对观察者执行一系列的操作即管理观察者。
// 观察者模式:vue2.0响应式原理...
class Observer {
update(message) {
// 消息触达,通知update执行
console.log('消息接收!', message);
}
}
class Demo {
update(message) {
console.log('消息接收!', message);
}
}
//目标
class ObserverList {
constructor() {
this.observerList = [];
}
add(observer) {
this.observerList.push(observer);
return this;
}
remove(observer) {
this.observerList = this.observerList.filter(ob => ob !== observer);
return this;
}
get(index) {
return this.observerList[index];
}
count() {
return this.observerList.length;
}
}
class Subject {
observers = new ObserverList;
add(observer) {
this.observers.add(observer);
}
remove(observer) {
this.observers.remove(observer);
}
notify(...params) {
for (let i = 0; i < this.observers.count(); i++) {
let item = this.observers.get(i);
item.update(...params);
}
}
}
let sub = new Subject;
sub.add(new Observer);
sub.add(new Observer);
sub.add(new Demo);
setTimeout(() => {
sub.notify('hello everybody');
}, 1000);
5.Mediator中介者模式
中介者模式和观察者模式区别如上图。
// 中介者
let mediator = (function() {
let topics = {};
// 订阅:订阅A组件中的某个方法
let subscribe = function subscribe(topic, callback) {
!topics[topic] ? topics[topic] = [] : null;
topics[topic].push({
context: this,
callback
});
};
// 发布:B组件中到某个阶段,可以通知之前订阅的方法执行
let publish = function publish(topic, ...params) {
if (!topics[topic]) return;
topics[topic].forEach(item => {
let {
callback,
context
} = item;
callback.call(context, ...params);
});
};
return {
subscribe,
publish
};
})();
6.Publish& Subscribe发布/订阅模式
另外开一篇讲这个,要不然这篇太长了。。。。。。
7.Decrator模式(ES7)
另外开一篇讲这个。