原则
很多设计模式,需要有相同的接口。如果不能确保接口相同,那么用传统的if/else和switch更合适。
工厂模式
场景
简单工厂你只需要一个正确的参数,就可以获取到你所需要的对象
// 根据用户的权限来渲染不同的页面let UserFactory = function(role) {function _ConstructorA() {}function _ConstructorB() {}switch (role) {case "a":return new _ConstructorA();break;case "b":return new _ConstructorB();break;}};let instanceA = UserFactory("a");let instanceB = UserFactory("b");
工厂方法
工厂方法我们只把它看作是一个实例化对象的工厂,它只做实例化对象这一件事情
// 根据用户的权限来渲染不同的页面let UserFactory = function(role) {if (this instanceof UserFactory) {return new this[role]();} else {return new UserFactory(role);}};UserFactory.prototype = {_ConstructorA: function() {},_ConstructorB: function() {}};let instanceA = UserFactory("a");let instanceB = UserFactory("b");
单例模式
场景
闭包
var single = (function() {var unique = undefined;function getInstance() {// 如果该实例存在,则直接返回,否则就对其实例化if (unique === undefined) {unique = new Construct();}return unique;}//...return {getInstance}})();
node服务器
class Db {static getInstance() {// 单例,多次实例化实例不共享的问题if (!Db.dbInstance) {Db.dbInstance = new Db();}return Db.dbInstance;}}
策略模式
场景
- 权限验证 前端渣渣唠嗑一下前端中的设计模式(真实场景例子)
-
总结
面向对象设计的原则——单一开闭原则。
舍弃if-else:当我们的代码中有很多个判断分支,每一个条件分支都会引起该“类”的特定行为以不同的方式作出改变。定义一些列的算法,把他们一个个封装起来。代理模式
场景
[ ] 图片预加载:虚拟代理
- 防抖:虚拟代理
- 控制台懒加载:虚拟代理
- 分页获取数据:缓存代理
[ ] 同一result的ajax请求:缓存代理 —— 复制fd
总结
面向对象设计的原则——单一职责原则
- 代理对象和另一个对象(本体)实现的是同样的接口
- 代理对象所做的不外乎节制对本体的访问
- 虚拟代理用于控制对那种创建开销很大的本体的访问,它会把本体的实例化推迟到有方法被调用的时候图片预加载,同步数据
- 缓存代理第二次执行函数的时候,传递了同样的参数,那么就直接使用缓存的结果利用arguments,作为对象的键放在闭包的cache对象中计算结果
- 保护代理权限控制和真正执行分开,当权限机制改动时只需改变权限代理函数权限验证
观察者模式
场景
