成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js設(shè)計模式 --- 代理設(shè)計模式

Tonny / 3258人閱讀

摘要:代理設(shè)計模式代理模式為其他對象提供一種代理以控制對這個對象的訪問。代理模式是常見的設(shè)計模式之一是指不直接調(diào)用實際的對象,而是通過代理對象,來間接的調(diào)用實際的對象。對象類定義了代理對象所代表的目標(biāo)對象。

代理設(shè)計模式
代理模式:為其他對象提供一種代理以控制對這個對象的訪問。

代理模式是常見的設(shè)計模式之一,是指不直接調(diào)用實際的對象,而是通過代理對象,來間接的調(diào)用實際的對象。
為什么要采用這種間接的形式來調(diào)用對象呢?一般是因為客戶端不想直接訪問實際的對象,或者訪問實際的對象存在困難,因此通過一個代理對象來完成間接的訪問, 比如請一個律師代理來打官司.

結(jié)構(gòu)

代理模式中的角色

接口
聲明了目標(biāo)類及代理類對象的共同接口,這樣在任何可以使用目標(biāo)對象的地方都可以使用代理對象。

對象類
定義了代理對象所代表的目標(biāo)對象。

代理類
代理對象內(nèi)部含有目標(biāo)對象的引用,從而可以在任何時候操作目標(biāo)對象;代理對象和目標(biāo)對象具有統(tǒng)一的接口,以便可以再任何時候替代目標(biāo)對象。代理對象通常在客戶端調(diào)用傳遞給目標(biāo)對象之前或者之后,執(zhí)行某些操作,而非單純的將調(diào)用傳遞給目標(biāo)對象。

接口

/* 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實現(xiàn)率同樣的接口, 通過組合方式將后者一對象作為事例, 當(dāng)調(diào)用對象方法時, 會通過這個屬性調(diào)用事例的方法, 這種方式和裝飾設(shè)計模式類似,

然而這種沒有任何訪問控制的代理的做法并沒有什么用處, 在各種其他的代理中虛擬代理是最有用的, 至于為什么可以參考 Jabascript設(shè)計模式 這本書,

虛擬代理用于控制對那種創(chuàng)建開銷很大的本體的訪問, 他會將本體的實例化推遲到有方法被調(diào)用的時候--懶加載,

虛擬代理類

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

代理設(shè)計模式和裝飾設(shè)計模式區(qū)別

裝飾模式會對被包裝對象的功能進(jìn)行修改或擴(kuò)充, 而代理模式只不過控制它的訪問.除了會添加一些控制代碼, 代理不會對本體方法進(jìn)行修改, 裝飾模式為修改方法而生

被包裝對象的創(chuàng)建方式, 裝飾模式被包裝實例化是完全獨立的, 代理模式則是代理的實例過程的一部分, 在虛擬代理中, 這種實例化受嚴(yán)格控制, 不許在內(nèi)部進(jìn)行

代理不會像裝飾那樣相互包裝,

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107531.html

相關(guān)文章

  • JS代理模式《JavaScript設(shè)計模式與開發(fā)實踐》閱讀筆記

    摘要:保護(hù)代理和虛擬代理保護(hù)代理當(dāng)有許多需求要向某對象發(fā)出一些請求時,可以設(shè)置保護(hù)代理,通過一些條件判斷對請求進(jìn)行過濾。虛擬代理在程序中可以能有一些代價昂貴的操作。而虛擬代理是最常用的一種代理模式。 代理模式 代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。 保護(hù)代理和虛擬代理 保護(hù)代理:當(dāng)有許多需求要向某對象發(fā)出一些請求時,可以設(shè)置保護(hù)代理,通過一些條件判斷對請求進(jìn)行過濾。...

    mist14 評論0 收藏0
  • JS設(shè)計模式代理模式

    摘要:什么是代理模式代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過經(jīng)紀(jì)人的溝通。不同于裝飾器,那種動態(tài)加載一個對象,可以說在代理模式當(dāng)中,代理是早已既定的。又稱單一功能原則,面向?qū)ο笪鍌€基本原則之一。 什么是代理模式 代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過經(jīng)紀(jì)人的溝通。而在JS當(dāng)中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態(tài)加載一個對象,可...

    widuu 評論0 收藏0
  • JS設(shè)計模式-代理模式

    摘要:代理模式的定義為其他對象提供一種代理以控制對這個對象的訪問。代理模式在客戶端和目標(biāo)對象之間起到一個中介作用,這樣可以起到保護(hù)目標(biāo)對象的作用。代理對象也可以對目標(biāo)對象調(diào)用之前進(jìn)行其他操作。 代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用。 原文鏈接 虛擬代理 虛擬代理...

    馬龍駒 評論0 收藏0
  • js設(shè)計模式--代理模式

    摘要:文章系列設(shè)計模式單例模式設(shè)計模式策略模式設(shè)計模式代理模式概念代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。 前言 本系列文章主要根據(jù)《JavaScript設(shè)計模式與開發(fā)實踐》整理而來,其中會加入了一些自己的思考。希望對大家有所幫助。 文章系列 js設(shè)計模式--單例模式 js設(shè)計模式--策略模式 js設(shè)計模式--代理模式 概念 代理模式是為一個對象提供一個代用品或占位符...

    pubdreamcc 評論0 收藏0
  • 每天一個設(shè)計模式·代理模式

    摘要:代理模式原文地址更多設(shè)計模式系列教程更多免費(fèi)教程博主按每天一個設(shè)計模式旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實現(xiàn)。代理模式優(yōu)缺點代理模式有高度解耦對象保護(hù)易修改等優(yōu)點。 代理模式·原文地址 更多《設(shè)計模式系列教程》 更多免費(fèi)教程 博主按:《每天一個設(shè)計模式》旨在初步領(lǐng)會設(shè)計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)...

    XiNGRZ 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<