资讯专栏INFORMATION COLUMN

js设计模式 --- 代理设计模式

Tonny / 3233人阅读

摘要:代理设计模式代理模式为其他对象提供一种代理以控制对这个对象的访问。代理模式是常见的设计模式之一是指不直接调用实际的对象,而是通过代理对象,来间接的调用实际的对象。对象类定义了代理对象所代表的目标对象。

代理设计模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问。

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

结构

代理模式中的角色

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

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

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

接口

/* 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);
  }
};

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

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107531.html

相关文章

  • JS代理模式《JavaScript设计模式与开发实践》阅读笔记

    摘要:保护代理和虚拟代理保护代理当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。虚拟代理在程序中可以能有一些代价昂贵的操作。而虚拟代理是最常用的一种代理模式。 代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤。...

    mist14 评论0 收藏0
  • JS设计模式代理模式

    摘要:什么是代理模式代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。不同于装饰器,那种动态加载一个对象,可以说在代理模式当中,代理是早已既定的。又称单一功能原则,面向对象五个基本原则之一。 什么是代理模式 代理模式,类似于明星的经纪人,想要拜访明星,需要先通过经纪人的沟通。而在JS当中,如果想访问一个类,需要通过另一个类来间接访问 。不同于装饰器,那种动态加载一个对象,可...

    widuu 评论0 收藏0
  • JS设计模式-代理模式

    摘要:代理模式的定义为其他对象提供一种代理以控制对这个对象的访问。代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象也可以对目标对象调用之前进行其他操作。 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 原文链接 虚拟代理 虚拟代理...

    马龙驹 评论0 收藏0
  • js设计模式--代理模式

    摘要:文章系列设计模式单例模式设计模式策略模式设计模式代理模式概念代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。 前言 本系列文章主要根据《JavaScript设计模式与开发实践》整理而来,其中会加入了一些自己的思考。希望对大家有所帮助。 文章系列 js设计模式--单例模式 js设计模式--策略模式 js设计模式--代理模式 概念 代理模式是为一个对象提供一个代用品或占位符...

    pubdreamcc 评论0 收藏0
  • 每天一个设计模式·代理模式

    摘要:代理模式原文地址更多设计模式系列教程更多免费教程博主按每天一个设计模式旨在初步领会设计模式的精髓,目前采用靠这吃饭和纯粹喜欢两种语言实现。代理模式优缺点代理模式有高度解耦对象保护易修改等优点。 代理模式·原文地址 更多《设计模式系列教程》 更多免费教程 博主按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript(_靠这吃饭_)和python(_纯粹喜欢_)...

    XiNGRZ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<