登录  /  注册
首页 > web前端 > js教程 > 正文

js代理设计模式详解

小云云
发布: 2018-02-22 13:22:30
原创
1291人浏览过

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

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

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

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

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

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

结构

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 
    登录后复制
  • 代理类

    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代理设计模式详解的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号