javascript部分设计模式总结

1、实现单例模式
let Singleton = function (name) {
this.name = name;
this.instance = null;
}

Singleton.prototype.getName = function () {
console.log(this.name)
}

Singleton.getInstance = function (name) {
if (!this.instance) {
this.instance = new Singleton(name)
}
return this.instance;
}

let a = Singeton.getInstance('hello world')

二、策略模式
javascrip 函数也是对像 所以可以用对象定义函数如
let strategies = {
"type1": (salary) => {
return salary 1
},
"type2": (salary) => {
return salary
2
},
"type3": (salary) => {
return salary * 3
}
}

let calcular = function (level, salary) {
return strategieslevel
}

三 、代理模式

就是不对原对象进行操作,引用另外的对象进行操作

let fruit = function (name) {
this.name = name;
}

fruit.prototype.getName = function () {
return this.name;
}

let 想吃苹果人 = {
gouBuy: (name) => {
console.log('帮我买几个苹果' + name)
}
}

let purchasing = {
buyCosmetic: function (fruit) {
想吃苹果人.gouBuy(fruit.getName())
}
}

purchasing.buyCosmetic(new fruit('苹果'))

四、迭代模式
也就是通过循环匹配符合的功能需求
ar getActiveUploadObj = function () {
try {
return new ActiveXObject("TXFTNActiveX.FTNUpload"); // IE 上传控件
} catch (e) {
return false;
}
};
var getFlashUploadObj = function () {
if (supportFlash()) { // supportFlash 函数未提供
var str = '<object type="application/x-shockwave-flash"></object>';
return $(str).appendTo($('body'));
}
return false;
};
var getFormUpladObj = function () {
var str = '<input name="file" type="file" class="ui-file"/>'; // 表单上传
return $(str).appendTo($('body'));
};

四、发布订阅模式
发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。在 JavaScript 开发中,我们一般用事件模型来替代传统的发布—订阅模式。
var event = {
clientList: [],
listen: function (key, fn) {
if (!this.clientList[key]) {
this.clientList[key] = [];
}
this.clientList[key].push(fn); // 订阅的消息添加进缓存列表
},
trigger: function () {
var key = Array.prototype.shift.call(arguments), // (1);
fns = this.clientList[key];
if (!fns || fns.length === 0) { // 如果没有绑定对应的消息
return false;
}
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments); // (2) // arguments 是 trigger 时带上的参数
}
}
};
再定义一个 installEvent 函数,这个函数可以给所有的对象都动态安装发布—订阅功能:
var installEvent = function (obj) {
for (var i in event) {
obj[i] = event[i];
}
};

五、 命令模式
命令模式是最简单和优雅的模式之一,命令模式中的命令(command)指的是一个执行某些
特定事情的指令。
命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收
者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发
送者和请求接收者能够消除彼此之间的耦合关系。例如

var bindClick = function (button, func) {
button.onclick = func;
};
var MenuBar = {
refresh: function () {
console.log('刷新菜单界面');
}
};
var SubMenu = {
add: function () {
console.log('增加子菜单');
},
del: function () {
console.log('删除子菜单');
}
};
bindClick(button1, MenuBar.refresh);
bindClick(button2, SubMenu.add);
bindClick(button3, SubMenu.del);
命令模式在 JavaScript 语言中是一种隐形的模式。

六、组合模式
组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更
小的“孙对象”构成的。像树状结构

用途: 表示对象的部分整体层次结构。组合模式可以方便地构造一棵树来表示对象的部分整
体结构。特别是我们在开发期间不确定这棵树到底存在多少层次的时候。在树的构造最
终完成之后,只需要通过请求树的最顶层对象,便能对整棵树做统一的操作。在组合模
式中增加和删除树的节点非常方便,并且符合开放封闭原则。
客户希望统一对待树中的所有对象。组合模式使客户可以忽略组合对象和叶对象的区别,
客户在面对这棵树的时候,不用关心当前正在处理的对象是组合对象还是叶对象,也就
不用写一堆 if、else 语句来分别处理它们。组合对象和叶对象会各自做自己正确的事情,
这是组合模式最重要的能力。

猜你喜欢

转载自blog.51cto.com/14582569/2594371