js代理设计模式详解

代理模式是常见的设计模式之一,是指不直接调用实际的对象,而是通过代理对象,来间接的调用实际的对象。

为什么要采用这种间接的形式来调用对象呢?一般是因为客户端不想直接访问实际的对象,或者访问实际的对象存在困难,因此通过一个代理对象来完成间接的访问, 比如请一个律师代理来打官司.

代理设计模式和装饰设计模式区别

装饰模式会对被包装对象的功能进行修改或扩充, 而代理模式只不过控制它的访问.除了会添加一些控制代码, 代理不会对本体方法进行修改, 装饰模式为修改方法而生

被包装对象的创建方式, 装饰模式被包装实例化是完全独立的, 代理模式则是代理的实例过程的一部分, 在虚拟代理中, 这种实例化受严格控制, 不许在内部进行

代理不会像装饰那样相互包装,

结构

js代理设计模式详解

代理模式中的角色

接口
声明了目标类及代理类对象的共同接口,这样在任何可以使用目标对象的地方都可以使用代理对象。

对象类
定义了代理对象所代表的目标对象。

代理类
代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象和目标对象具有统一的接口,以便可以再任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或者之后,执行某些操作,而非单纯的将调用传递给目标对象。

接口

/* Library interface. */var Library = new Interface('Library', ['findBooks', 'checkoutBook', 'returnBook']);

登录后复制

对象类

/* PublicLibrary class. */var PublicLibrary = function(books) { // implements Library  this.catalog = {};  for(var i = 0, len = books.length; i < len; i++) {    this.catalog[books[i].getIsbn()] = { book: books[i], available: true };  }};PublicLibrary.prototype = {  findBooks: function(searchString) {    var results = [];    for(var isbn in this.catalog) {      if(!this.catalog.hasOwnProperty(isbn)) continue;      if(searchString.match(this.catalog[isbn].getTitle()) ||          searchString.match(this.catalog[isbn].getAuthor())) {        results.push(this.catalog[isbn]);      }    }    return results;  },  checkoutBook: function(book) {    var isbn = book.getIsbn();    if(this.catalog[isbn]) {      if(this.catalog[isbn].available) {        this.catalog[isbn].available = false;        return this.catalog[isbn];      }      else {        throw new Error('PublicLibrary: book ' + book.getTitle() +           ' is not currently available.');      }    }    else {      throw new Error('PublicLibrary: book ' + book.getTitle() + ' not found.');    }  },  returnBook: function(book) {    var isbn = book.getIsbn();    if(this.catalog[isbn]) {      this.catalog[isbn].available = true;    }    else {      throw new Error('PublicLibrary: book ' + book.getTitle() + ' not found.');    }      }};

登录后复制

代理类

var PublicLibraryProxy = function(catalog) { // implements Library  this.library = new PublicLibrary(catalog);};PublicLibraryProxy.prototype = {  findBooks: function(searchString) {    return this.library.findBooks(searchString);  },  checkoutBook: function(book) {    return this.library.checkoutBook(book);  },  returnBook: function(book) {    return this.library.returnBook(book);  }};

登录后复制

PublicLibraryProxy与PublicLibrary实现率同样的接口, 通过组合方式将后者一对象作为事例, 当调用对象方法时, 会通过这个属性调用事例的方法, 这种方式和装饰设计模式类似,

然而这种没有任何访问控制的代理的做法并没有什么用处, 在各种其他的代理中虚拟代理是最有用的, 至于为什么可以参考 Jabascript设计模式 这本书,

虚拟代理用于控制对那种创建开销很大的本体的访问, 他会将本体的实例化推迟到有方法被调用的时候–懒加载,

虚拟代理类

var PublicLibraryVirtualProxy = function(catalog) { // implements Library  this.library = null;  this.catalog = catalog; // Store the argument to the constructor.};PublicLibraryVirtualProxy.prototype = {  _initializeLibrary: function() {    if(this.library === null) {      this.library = new PublicLibrary(this.catalog);    }  },  findBooks: function(searchString) {    this._initializeLibrary();    return this.library.findBooks(searchString);  },  checkoutBook: function(book) {    this._initializeLibrary();    return this.library.checkoutBook(book);  },  returnBook: function(book) {    this._initializeLibrary();    return this.library.returnBook(book);  }};

登录后复制

相关推荐:

基于Java的代理设计模式_MySQL

以上就是js代理设计模式详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2786325.html

(0)
上一篇 2025年3月8日 17:42:34
下一篇 2025年3月8日 17:42:44

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS内存管理实例讲解

    js有完善的内存处理机制,所以之前我们不用特别的去关注这块的实现。页面不快了,刷新一下就好了;浏览器卡顿,重启一下就ok。但是随着spa和移动app的流行,以及未来可能存在的pwa的实现,js内存可能成为新的内存瓶颈。 1.什么是内存泄漏 …

    2025年3月8日 编程技术
    200
  • 10个js常用函数

    1,对于cookie的操作,其中包括了设置、获取、删除cookie的操作。下面这个是我在公司的项目里面使用的工具库里的方法,测试就不测试了 // setCookie()// @About 设置cookiefunction setCookie…

    2025年3月8日
    200
  • JavaScript中循环类型总结分析

    在英语中,loop这个词指的是由弯曲的曲线所产生的形状。类似的概念,loop这个词已经被用于编程中。如果你看到下图,你就会清楚的知道指令的流动是如何在一个循环的动作中不断重复的。在编程中,循环的概念并不是什么新概念,它们常常在编码时使用。虽…

    2025年3月8日 编程技术
    200
  • JS/jQuery实现DIV延时几秒后消失或显示

    本文主要和大家介绍了js/jquery实现p延时几秒后消失或显示的方法,结合实例形式分析了javascript使用settimeout及jquery使用delay方法实现延迟显示功能的相关操作技巧,需要的朋友可以参考下,希望能帮助到大家。 …

    编程技术 2025年3月8日
    200
  • JS操作剪贴板代码分享

    javascript可以轻松操作客户端剪贴板内容,不过只适用ie5以上浏览器。javascript可以使用window.clipboarddata对象处理剪贴板内容。保存到剪贴板的方法setdata(param1, param2)。本文主要…

    编程技术 2025年3月8日
    200
  • javascript闭包 var that=this详解

    速览 var f1 = function(){ var a = 999; nAdd = function(){n+=1} //没有var,nAdd是全局变量 f2 = function(){ alert(a) } return f2;}va…

    编程技术 2025年3月8日
    200
  • javascript高仿热血传奇游戏代码分享

    游戏的第一个版本开发于14年,浏览器端使用html+css+js,服务端使用asp+php,通讯采用ajax,数据存储使用access+mysql。不过由于一些问题(当时还不会用node,用asp写复杂的逻辑真的会写吐;当时对canvas写…

    2025年3月8日 编程技术
    200
  • 关于JavaScript正则表达式函数总结

    正则表达式作为一种匹配处理字符串的利器在很多语言中都得到了广泛实现和应用.这篇文章主要介绍了javascript正则表达式函数总结,需要的朋友可以参考下,希望能帮助到大家。 /* 测试环境:Chrome 63.0.3239.132 */ J…

    编程技术 2025年3月8日
    200
  • js调用json的方法总结

    本文主要给大家详细分析了js调用json方法的总结,对此有需要的朋友可以参考学习下,希望能帮助到大家。 Ajax基础 ajax:无刷新数据读取,读取服务器上的信息 HTTP请求方法: GET:用于获取数据,如浏览帖子 ajax.judgeX…

    编程技术 2025年3月8日
    200
  • Nodejs下使用gm圆形裁剪并合成图片

    说到nodejs下的图片处理可能第一想到就是gm,gm底层可以是graphicsmagic(其实也是gm的由来),也可以是imagemagick(其实graphicsmagic本身也是从imagemagic分割而来,现在独立了)。虽然这两个…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论