在我之前的部落格中,我探索了各種處理對象創建機制的創作設計模式。現在,是時候深入研究結構設計模式,它重點關注如何組合物件和類別以形成更大的結構,同時保持它們的靈活性和高效性。讓我們從代理設計模式開始
代理設計模式是一種結構設計模式,它提供一個物件代表另一個物件。它充當控制對真實物件的存取的中介,添加附加行為,例如延遲初始化、日誌記錄、存取控製或緩存,而無需更改原始物件的程式碼。
在 JavaScript 中,代理程式是 Proxy 物件提供的內建功能,可讓您為屬性存取、賦值、函數呼叫等基本操作定義自訂行為。
代理模式在以下情況下特別有用:
想像一下,您有一幅大畫想要向客人展示,但需要花費很多時間才能從儲藏室中取出它(因為它很重並且需要時間來搬運)。您決定使用這幅畫的小明信片圖像,在他們等待實際畫作被獲取時快速向他們展示,而不是每次都等待。
在這個比喻中:
將房地產經紀人視為代理人。當你想買房子時,你不會立即參觀每棟房子(裝載實體)。相反,房地產經紀人(代理人)首先向您展示照片和描述。只有當你準備購買時(即,當你呼叫display()時),代理商才會安排看房(載入實體)。
讓我們使用 Web 應用程式中的圖像加載範例,我們希望延遲圖像的加載,直到用戶請求它(延遲加載)。代理可以充當佔位符,直到載入真實圖像。
以下是如何在 JavaScript 中實作代理設計模式。
// Step 1: The real object class RealImage { constructor(filename) { this.filename = filename; this.loadImageFromDisk(); } loadImageFromDisk() { console.log(`Loading ${this.filename} from disk...`); } display() { console.log(`Displaying ${this.filename}`); } } // Step 2: The proxy object class ProxyImage { constructor(filename) { this.realImage = null; // no real image yet this.filename = filename; } display() { if (this.realImage === null) { // load the real image only when needed this.realImage = new RealImage(this.filename); } this.realImage.display(); // display the real image } } // Step 3: Using the proxy to display the image const image = new ProxyImage("photo.jpg"); image.display(); // Loads and displays the image image.display(); // Just displays the image (already loaded)
說明:
1)。真實影像:
2)。代理圖像:
3)。用法:
ES6 代理由一個代理建構函式組成,建構函式接受目標和處理程序作為參數
const proxy = new Proxy(target, handler)
這裡,target代表應用代理的對象,而handler是一個特殊的對象,定義了代理的行為。
處理程序物件包含一系列具有預先定義名稱的可選方法,稱為陷阱方法(例如 apply、get、set 和 has),當對代理實例執行對應操作時,這些方法會自動呼叫。
讓我們透過使用內建代理實作計算器來理解這一點
// Step 1: The real object class RealImage { constructor(filename) { this.filename = filename; this.loadImageFromDisk(); } loadImageFromDisk() { console.log(`Loading ${this.filename} from disk...`); } display() { console.log(`Displaying ${this.filename}`); } } // Step 2: The proxy object class ProxyImage { constructor(filename) { this.realImage = null; // no real image yet this.filename = filename; } display() { if (this.realImage === null) { // load the real image only when needed this.realImage = new RealImage(this.filename); } this.realImage.display(); // display the real image } } // Step 3: Using the proxy to display the image const image = new ProxyImage("photo.jpg"); image.display(); // Loads and displays the image image.display(); // Just displays the image (already loaded)
使用代理程式的最佳部分是:
- 代理物件繼承了原Calculator類別的原型。
- 透過代理設置的陷阱來避免突變。
代碼說明
1)。 原型繼承:
2)。 處理 getOperations:
3)。 防止突變:
每當嘗試修改目標物件上的任何屬性時,設定陷阱都會引發錯誤。這確保了不變性。
4)。 透過代理人使用原型方法:
代理允許存取加、減、乘、除等方法,所有這些方法都在原始物件的原型上定義。
這裡要觀察的重點是:
如果您已經做到了這一步,請不要忘記按讚❤️,並在下面發表評論以提出任何問題或想法。您的回饋對我來說至關重要,我很樂意收到您的來信!
以上是代理設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!