摘要:代理設計模式代理模式為其他對象提供一種代理以控制對這個對象的訪問。代理模式是常見的設計模式之一是指不直接調用實際的對象,而是通過代理對象,來間接的調用實際的對象。對象類定義了代理對象所代表的目標對象。
代理設計模式
代理模式:為其他對象提供一種代理以控制對這個對象的訪問。結構 代理模式中的角色代理模式是常見的設計模式之一,是指不直接調用實際的對象,而是通過代理對象,來間接的調用實際的對象。
為什么要采用這種間接的形式來調用對象呢?一般是因為客戶端不想直接訪問實際的對象,或者訪問實際的對象存在困難,因此通過一個代理對象來完成間接的訪問, 比如請一個律師代理來打官司.
接口
聲明了目標類及代理類對象的共同接口,這樣在任何可以使用目標對象的地方都可以使用代理對象。
對象類
定義了代理對象所代表的目標對象。
代理類
代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象和目標對象具有統一的接口,以便可以再任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或者之后,執行某些操作,而非單純的將調用傳遞給目標對象。
接口
/* 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); } };
代理設計模式和裝飾設計模式區別
裝飾模式會對被包裝對象的功能進行修改或擴充, 而代理模式只不過控制它的訪問.除了會添加一些控制代碼, 代理不會對本體方法進行修改, 裝飾模式為修改方法而生
被包裝對象的創建方式, 裝飾模式被包裝實例化是完全獨立的, 代理模式則是代理的實例過程的一部分, 在虛擬代理中, 這種實例化受嚴格控制, 不許在內部進行
代理不會像裝飾那樣相互包裝,
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107531.html
摘要:保護代理和虛擬代理保護代理當有許多需求要向某對象發出一些請求時,可以設置保護代理,通過一些條件判斷對請求進行過濾。虛擬代理在程序中可以能有一些代價昂貴的操作。而虛擬代理是最常用的一種代理模式。 代理模式 代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。 保護代理和虛擬代理 保護代理:當有許多需求要向某對象發出一些請求時,可以設置保護代理,通過一些條件判斷對請求進行過濾。...
摘要:什么是代理模式代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。不同于裝飾器,那種動態加載一個對象,可以說在代理模式當中,代理是早已既定的。又稱單一功能原則,面向對象五個基本原則之一。 什么是代理模式 代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。而在JS當中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態加載一個對象,可...
摘要:代理模式的定義為其他對象提供一種代理以控制對這個對象的訪問。代理模式在客戶端和目標對象之間起到一個中介作用,這樣可以起到保護目標對象的作用。代理對象也可以對目標對象調用之前進行其他操作。 代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。 原文鏈接 虛擬代理 虛擬代理...
摘要:文章系列設計模式單例模式設計模式策略模式設計模式代理模式概念代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。 前言 本系列文章主要根據《JavaScript設計模式與開發實踐》整理而來,其中會加入了一些自己的思考。希望對大家有所幫助。 文章系列 js設計模式--單例模式 js設計模式--策略模式 js設計模式--代理模式 概念 代理模式是為一個對象提供一個代用品或占位符...
摘要:代理模式原文地址更多設計模式系列教程更多免費教程博主按每天一個設計模式旨在初步領會設計模式的精髓,目前采用靠這吃飯和純粹喜歡兩種語言實現。代理模式優缺點代理模式有高度解耦對象保護易修改等優點。 代理模式·原文地址 更多《設計模式系列教程》 更多免費教程 博主按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前采用javascript(_靠這吃飯_)和python(_純粹喜歡_)...
閱讀 1367·2021-09-10 10:51
閱讀 2834·2019-08-30 15:54
閱讀 3374·2019-08-29 17:11
閱讀 935·2019-08-29 16:44
閱讀 1396·2019-08-29 13:47
閱讀 1093·2019-08-29 13:47
閱讀 1493·2019-08-29 12:23
閱讀 1048·2019-08-28 18:18