/*
一、单例模式
*/
var Universe;
(function () {
var instance;
Universe = function Universe() {
if (instance) {
return instance;
}
instance = this;
};
}());
/*
二、构造函数模式
*/
function VM() {
this.name = "123";
}
VM.prototype.Method = function () { }
var vm = new VM();
/*
三、建造者模式 --- 回调
一个复杂对象由多个部分对象构成,应对部分对象发生变化,组合后算法结构不变的情况
*/
// 回调:回调函数的处理,不关心数据来源,如ajax里的succes
function GetBeer(id, callback) {
//复杂对象 = GetBeer ,算法结构不变
asyncRequest('get', URL, function (resp) {
//部分对象callback,算法变化
callback(resp, responseText);
});
}
var el = document.querySelector('#test');
el.addEventListener('click', GetBeerByIdBridge, false); function GetBeerByIdBridge(e) {
GetBeer(this.id, function (beer) { });
}
/*
四、工厂模式
*/
//创建对象时,无需指定创建对象的具体类
var productManager = {};
productManager.createProductA = function () { };
productManager.createProductB = function () { }
productManager.factory = function (type) {
return new productManager[type]();
}
productManager.factory("createProductA");
/*
五、装饰者模式
*/
// 为已有功能动态地添加更多功能的一种方式,把每个要装饰的功能放在单独的函数里,然后用该函数包装所要装饰的已有函数对象
// 优点是把类(函数)的核心职责和装饰功能区分开了
var tree = {};
tree.decorate = function () { }
tree.getDecorate = function (funcName) {
tree[funcName].prototype = this;//指定当前方法的原型
return new tree[funcName];
}
tree.Blue = function () {
this.decorate = function () {
this.Blue.prototype.decorate();//先执行原型的decorate 即:tree.decorate();
}
}
tree.Red = function () {
this.decorate = function () {
this.Red.prototype.decorate();//先执行原型的decorate 即:tree.Bule.decorate();
}
}
tree = tree.getDecorate("Bule");//将Bule赋值给tree,父级原型tree.Decorate可用
tree = tree.getDecorate("Red");//将Red赋值给tree,父级原型tree.Bule.Decorate可用
tree.decorate();
/*
六、外观模式
*/
// 把一些复杂操作封装起来,并创建一个简单的接口用于调用
/*
使用条件
首先,设计阶段:三层架构之间建立外观Facade。
其次,开发阶段:子系统越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。
第三,老系统过于复杂,无法再进行修改,让新系统与外观facade交互。
*/
var moduleEvent = {
stop: function (e) {
e.preventDefault();
e.stopPropagation();
}
}
/*
七、代理模式
1.远程代理,也就是为了一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实,就像web service里的代理类一样。
2.虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,比如浏览器的渲染的时候先显示问题,而图片可以慢慢显示(就是通过虚拟代理代替了真实的图片,此时虚拟代理保存了真实图片的路径和尺寸。
3.安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限。
4.智能指引,只当调用真实的对象时,代理处理另外一些事情。例如C#里的垃圾回收,使用对象的时候会有引用次数,如果对象没有引用了,GC就可以回收它了
*/
var girl = function (naem) { }
var sneder = function () {
this.send = function () { }
}
var proxy = function () {
this.send = function () {
(new sender()).send();
}
}
/*
八、观察者模式 -- 发布订阅模式
多个观察者观察一个主题对象,主题对象发生变化,通知所有观察者
*/
var pubsub = {};
(function (q) {
var topics = {},
subUid = -1;
//订阅方法
q.subscribe = function (topic,func) {
if (!topics[topic]) {
topics[topic] = [];
}
var token = (++subUid).toString();
topics[topic].push({
token: koken,
func: func
});
return token;
}
//取消订阅
q.unSubscribe = function (token) {
for (var m in topics) {
if (topics[m]) {
for (var i = 0, j = topics[m].length; i < j;i++) {
if (topics[m].token==token) {
topics[m].splice(i, 1);
return token;
}
}
}
}
return false;
}
//发布方法
q.publish = function (topic,args) {
if (!topics[topic]) {
return false;
}
setTimeout(function () {
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
subscribers[len].func(topic, args);
}
}, 0);
}
}(pubsub));

设计模式 --深入理解javascript的更多相关文章

  1. js架构设计模式——理解javascript中的MVVM开发模式

    理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewMod ...

  2. 【设计模式+原型理解】第一章:使用Javascript来巧妙实现经典的设计模式

    刚开始学习设计模式之前,我是没想说要学习设计模式的,我只是因为想学习JS中的原型prototype知识,一开始我想JS中为什么要存在原型这个东西?于是慢慢通过原型而接触到设计模式,后来发现我这个过程是 ...

  3. 深入理解JavaScript系列(38):设计模式之职责链模式

    介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...

  4. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...

  5. 深入理解JavaScript系列(30):设计模式之外观模式

    介绍 外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用. 正文 外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦 ...

  6. 深入理解JavaScript系列(31):设计模式之代理模式

    介绍 代理,顾名思义就是帮助别人做事,GoF对代理模式的定义如下: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 代理模式使得代理对象控制具体对象的引用.代理几乎可以是任何对 ...

  7. 深入理解JavaScript系列(25):设计模式之单例模式

    介绍 从本章开始,我们会逐步介绍在JavaScript里使用的各种设计模式实现,在这里我不会过多地介绍模式本身的理论,而只会关注实现.OK,正式开始. 在传统开发工程师眼里,单例就是保证一个类只有一个 ...

  8. 深入理解javascript之设计模式

    设计模式 设计模式是命名.抽象和识别对可重用的面向对象设计实用的的通用设计结构. 设计模式确定类和他们的实体.他们的角色和协作.还有他们的责任分配. 每个设计模式都聚焦于一个面向对象的设计难题或问题. ...

  9. 深入理解JavaScript系列(33):设计模式之策略模式(转)

    介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...

随机推荐

  1. sqoop导出工具

    sqoop的导出工具是把HDFS上文件中的数据导出到mysql中 mysql中的表 现在在linux上创建一个文件,并把这个文件上传到hdfs上 cat person.txt ,no7, ,no8, ...

  2. tomcat学习笔记2

    LNMT在网站架构中的实现过程: Client --> http --> Nginx --> reverse_proxy (http) --> tomcat (http con ...

  3. PHP session回收机制

    由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效.当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/sessi ...

  4. 【转】CSS white-space 属性

    定义和用法 white-space 属性设置如何处理元素内的空白. 这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认值 ...

  5. 通过JAVA代码获取手机的一些基本信息(本机号码,SDK版本,系统版本,手机型号)

    代码如下: package com.zzw.getPhoneInfos; import android.app.Activity; import android.content.Context; im ...

  6. Android———从GitHub上下载源码的方法【Written By KillerLegend】

    首先声明,本文说的是从GitHub上下载源码而非上传源码! 1:下载tortoisegit,下载地址为: https://code.google.com/p/tortoisegit/wiki/Down ...

  7. 银河英雄传说 (codevs 1540) 题解

    [问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰 ...

  8. linuxok6410的I2C驱动分析---用户态驱动

    3  i2c-dev 3.1 概述 之前在介绍I2C子系统时,提到过使用i2c-dev.c文件在应用程序中实现我们的I2C从设备驱动.不过,它实现的是一个虚拟,临时的i2c_client,随着设备文件 ...

  9. Android Cookie共享到WebView避免再次登录(保持登录状态)

    最近在做项目时用到了webview打开指定链接的网页,可已经把webview设置了cookie但始终跳转到登录页面,这明显是cookie没有设置成功导致webview没有将设置好的cookie发送出去 ...

  10. String.split()方法你可能不知道的一面

    一.问题 java中String的split()是我们经常使用的方法,用来按照特定字符分割字符串,那么我们看以下一段代码: public void splitTest() { String str = ...