『面試的底氣』—— 設計模式之代理模式(二)|8月更文挑戰

這是我參與8月更文挑戰的第12天,活動詳情查看:8月更文挑戰前端

前言

在面試高級前端時,每每會遇到一些關於設計模式的問題,每次都回答不太理想。恰逢8月更文挑戰的活動,準備用一個月時間好好理一下關於設計模式方面的知識點,給本身增長點面試的底氣。web

在上一篇文章『面試的底氣』—— 設計模式之代理模式(一) 用類來實現代理模式中的虛擬代理,而不使用類的方式也能夠實現代理模式,好比用高階函數也能夠實現一個代理模式。本文就用高階函數來動態建立一個緩存代理來再次介紹代理模式。面試

緩存代理

緩存代理能夠爲一些開銷大的運算結果提供暫時的存儲,在下次運算時,若是傳遞進來的參 數跟以前一致,則能夠直接返回前面存儲的運算結果。設計模式

高階函數簡單的能夠理解爲把一個函數做爲參數傳入一個函數中。那麼如何用高階函數動態建立一個緩存代理,就是實現一個專門用於建立緩存代理的工廠函數,把要代理的函數傳入這個工廠函數,返回一個代理函數。緩存

const createProxyFactory = (fn) =>{
  let cache = {};
  return function () {
    const args = Array.prototype.join.call(arguments, ',');
    if (args in cache) {
      return cache[args];
    }
    return cache[args] = fn.apply(this, arguments);
  }
};
複製代碼

好比如今要爲一個計算乘積的mult函數實現緩存代理,markdown

const mult = function () {
  let a = 1;
  for (let i = 0, l = arguments.length; i < l; i++) {
    a = a * arguments[i];
  }
  return a;
};
複製代碼

mult函數看成參數傳入createProxyFactory這個建立緩存代理的函數中便可爲mult函數實現緩存代理。app

小結

代理模式能夠符合單一職責原則,使被代理函數的職責單一,使被代理函數高內聚。能夠知足開放-封閉原則,使得被代理函數封閉,對其擴展新功能在代理函數中實現,使被代理函數低耦合。函數

雖然代理模式很是有用,但咱們在編寫業務代碼的時候,每每不須要去預先猜想是否須要使用代理模式。 當真正發現不方便直接訪問某個對象或改變某個函數的內部代碼時,再編寫代理也不遲。post

相關文章
相關標籤/搜索