设计原则
- 单一职责原则(SRP)
一个对象或方法只做一件事情。如果一个方法承担了过多的职责,那么在需求的变迁过程中,需要改写这个方法的可能性就越大。 应该把对象或方法划分成较小的粒度 - 最少知识原则(LKP)
一个软件实体应当 尽可能少地与其他实体发生相互作用 应当尽量减少对象之间的交互。如果两个对象之间不必彼此直接通信,那么这两个对象就不要发生直接的 相互联系,可以转交给第三方进行处理 - 开放-封闭原则(OCP)
软件实体(类、模块、函数)等应该是可以 扩展的,但是不可修改当需要改变一个程序的功能或者给这个程序增加新功能的时候, 可以使用增加代码的方式,尽量避免改动程序的源代码,防止影响原系统的稳定
多态
概念:
同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给
不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。多态
背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事物”与 “可
能改变的事物”分离开来。
/*
在这个例子中,动物都会叫,这是不变的,但是不同类型的动物具体怎么叫是可变的。
把不变的部分隔离出来,把可变的部分封装起来,这给予了我们扩展程序的能力,程序看起来是可生长的,也是符合开放-封闭原则的,相对于修改代码来说,仅仅增加代码就能
完成同样的功能,这显然优雅和安全得多。
*/
function Chicken(){
this.name = '小鸡'
}
Chicken.prototype.sound = function(){
console.log('咯咯咯')
}
function Duck(){
this.name = '小鸭'
}
Duck.prototype.sound = function(){
console.log('嘎嘎嘎')
}
function makeSound(animal){
animal.sound()
}
makeSound(new Chicken())
makeSound(new Duck())
装饰器模式
概念:
以动态地给某个对象添加一些额外的职责,而不会影响从这个类中派生的其他对象。是一
种“即用即付”的方式,能够在不改变对象自身的基础上,在程序运行期间给对象动态地 添
加职责
使用场景:
参数验证,日子记录,埋点,ajax请求携带公共参数
示例
function cooke(){
console.log('做饭')
}
Function.prototype.before = function(fn){
const _this = this
return function(){
fn.apply(this,arguments)
_this.apply(this,arguments)
}
}
Function.prototype.after = function(fn){
const _this = this
return function(){
_this.apply(this,arguments)
fn.apply(this,arguments)
}
}
cooke = cooke.before(function(){
console.log('烧水')
})
cooke = cooke.after(function(){
console.log('吃饭')
})
cooke()
适配器模式
概念:
是解决两个软件实体间的接口不兼容的问题,对不兼容的部分进行适配(解决两个已有接口
之间不匹配的问题)
使用场景:
老旧接口之间的适配,不同api实现同样功能接口兼容
示例:
// 渲染数据,格式限制为数组了
function renderData(data) {
data.forEach(function(item) {
console.log(item);
});
}
// 对非数组的进行转换适配
function arrayAdapter(data) {
if (typeof data !== 'object') {
return [];
}
if (Object.prototype.toString.call(data) === '[object Array]') {
return data;
}
var temp = [];
for (var item in data) {
if (data.hasOwnProperty(item)) {
temp.push(data[item]);
}
}
return temp;
}
var data = {
0: 'A',
1: 'B',
2: 'C'
};
renderData(arrayAdapter(data)); // A B C