前言
在了解设计模式后,发现它起始没有那么高大上,有些是我们平时开发中已经用到的东西(更好的设计模块,组织共同的代码),它只是给这些好用的代码模式起了一个名字而已。
一、设计模式
项目/功能 = 模块 + 沟通;
1. 设计模式扮演的角色
1. 帮助我们组织模块(通过一些设计模式,组织模块间的组成结构);
2. 帮助我们设计沟通(有的设计模式可以帮助我们设计模块间如何沟通);
3. 提高代码质量(通过设计模式,让代码更加优雅);
2. 程序设计原则
1. 开闭原则(我们的程序对扩展开放,对修改关闭。);
2. 单一职责原则(模块只做一件事情,它的职责越单一越好);
3. 依赖倒置原则(上层模块不依赖具体的下层模块,而应该依赖抽象层);
//依赖倒置原则(上层模块不依赖具体的下层模块,而应该依赖抽象层)代码实例
//假设有四种菜,一个点单类
//1.点单依赖菜的代码(有几种菜,点单上就忒有几种方法,当菜发生变动时,点单上的方法也要发生变动)
function food1() {}
function food2() {}
function food3() {}
function food4() {}
function order() {}
order.prototype.orderFood1 = function() {}
order.prototype.orderFood2 = function() {}
order.prototype.orderFood3 = function() {}
order.prototype.orderFood4 = function() {}
//2.在菜和点单中间,抽象出一个餐馆层的代码(这样菜无论怎么变动都不会影响我们的点单,我们只需要改变一下抽象层餐馆)
function food1() {}
function food2() {}
function food3() {}
function food4() {}
function resturn(food) { //餐馆
var list = { //类似菜单
food1: new food1(),
food2: new food2(),
food3: new food3(),
}
return list[food];
}
function order(food) { //点单
return resturn(food);
}
4. 接口隔离原则(接口应该细化,功能应该单一,不要一个接口调用太多方法);
5. 迪米特法则/最少知识原则(两个对象之间产生沟通,但两个对象没有必要互相非常了解);
6. 里氏替换原则(关注点在“继承”,子类继承父类时,要保证完全继承父类的属性和方法,这样父类使用的地方,子类可以替换);
3. 设计模式的分类
1. 创建型(这些设计模式可以帮助我们优雅地创建对象);
1.1. 工厂模式——大量创建对象;
1.2. 建造者模式——精细化组合对象;
1.3. 单例模式——全局只能有我一个;
1.4. 原型模式——JavaScript的灵魂;
2. 结构型(帮助我们优雅地设计代码结构);
2.1. 外观模式——给你一个套餐;
2.2. 适配器模式——用适配代替更改;
2.3. 装饰者模式——更优雅地扩展需求;
2.4. 享元模式——共享来减少数量;
2.5. 桥接模式——独立出来,然后再对接过去;
3. 行为型(模块之间行为的模式总结,帮助我们组织模块行为);
3.1. 观察者模式——我作为第三方转发;
3.2. 状态模式——用状态代替判断;
3.3. 策略模式——算法工厂;
3.4. 职责链模式——像生产线一样组织模块;
3.5. 命令模式——用命令去解耦;
3.6. 迭代器模式——告别for循环;
4. 技巧型(一些帮助我们优化代码的技巧);
4.1. 链模式——链式调用;
4.2. 委托模式——让别人代替你收快递;
4.3. 数据访问模式——一个方便的数据管理器;
4.4. 惰性模式——我要搞机器学习;
4.5. 等待者模式——等你们都回来再吃饭;
5. 架构型(清晰的将一些子系统组合在一起);
总结
革命尚未成功,同志仍需努力。