摘要:什么是代理模式代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。不同于裝飾器,那種動態加載一個對象,可以說在代理模式當中,代理是早已既定的。又稱單一功能原則,面向對象五個基本原則之一。
什么是代理模式
代理模式,類似于明星的經紀人,想要拜訪明星,需要先通過經紀人的溝通。而在JS當中,如果想訪問一個類,需要通過另一個類來間接訪問 。不同于裝飾器,那種動態加載一個對象,可以說在代理模式當中,代理是早已既定的。
別人眼中的代理
再拿最常遇到的收快遞這一個社會行為舉例吧。
很早之前,我們收發快遞都是直接和快遞員交互的,例如:
而現在,加入了代理之后,可以通過第三方替我們接收快遞,即:
這是生活當中一個非常常見的例子,可以說代理的存在,大大的便利了“我”這個對象。下面就讓我們在程序中看看代理是如何方便“我”的。
程序做這樣一件事,即根據不同的快遞類型,來進行不同的操作(執行不同的函數),那么在沒有引進代理之前,寫法可能是這個樣子。
無代理:
class getDelivery { constructor() { } gets(a) { let fn1 = () => { setTimeout(() => { //some fns of fn1 console.log(`獲取快遞有:${a}`) }, 1000) } let fn2 = () => { setTimeout(() => { //some fns of fn2 console.log(`獲取快遞有:${a}`) }, 2000) } let fn3 = () => { setTimeout(() => { //some fns of fn3 console.log(`獲取快遞有:${a}`) }, 3000) } let deliver = {"中通": fn1, "EMS": fn2, "順豐": fn3}[name]; return deliver(); } } getDelivery.prototype.proxyGets("中通")
定義一個類,上面的gets函數去判斷不同的快遞類型,然后去執行相對應的操作。
現在,當我們引入代理模式之后,代碼可能是這樣的:
代理:
class getDelivery { constructor() { } gets(a) { console.log(`獲取快遞有:${a}`) } } class proxy extends getDelivery { constructor() { super(); } proxyGets(name) { let fn1 = () => { setTimeout(() => { //some fns of fn1 super.gets("中通快遞") }, 1000) } let fn2 = () => { setTimeout(() => { //some fns of fn2 super.gets("EMS") }, 2000) } let fn3 = () => { setTimeout(() => { //some fns of fn3 super.gets("順豐") }, 3000) } let deliver = {"中通": fn1, "EMS": fn2, "順豐": fn3}[name]; return deliver(); } } proxy.prototype.proxyGets("中通")
(ps:本代碼僅用于代理模式的示例,每次調用函數重新聲明fn1等方法是不對的)
ok,這兩種方法都會得到這樣的結果:
而后者在代碼上還多了一些,但為什么這里還是推薦使用后面這種模式來寫代碼呢?
首先介紹一個面向對象設計原則,單一職責原則。
又稱單一功能原則,面向對象五個基本原則(SOLID)之一。它規定一個類應該只有一個發生變化的原因。所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這個類就具有多于一個的職責。而單一職責原則就是指一個類或者模塊應該有且只有一個改變的原因。
而在本例中,我們并不關心是什么快遞,關心的只是接到快遞觸發的結果,或者說接到快遞后,執行的任務才是getDelivery 這個類的核心,至于中間的過程,應該交給專門處理他的類來判別。
第二個原則:開放封閉原則
開放封閉原則(OCP,Open Closed Principle)是所有面向對象原則的核心。軟件設計本身所追求的目標就是封裝變化、降低耦合,而開放封閉原則正是對這一目標的最直接體現。其他的設計原則,很多時候是為實現這一目標服務的,例如以Liskov替換原則實現最佳的、正確的繼承層次,就能保證不會違反開放封閉原則。
還以接收快遞為例,比如有一天,接收快遞的形勢變了,或者說,根本不需要判斷是什么快遞,可以隨時接收,那么proxy 這個類其實就沒有用了,此時我們可以直接調用getDelivery這個類。但是,如果以第一種寫法的話,那就是無路可退了,只能去原對象中去刪掉相對應的邏輯。當代碼復雜程度變高的話,高耦合的程序,會讓人非常惡心。
代理模式,在實踐當中還可以應用于緩存ajax異步數據,惰性加載等等方面,本文不詳細講解,僅作拋磚引玉的入門參考。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91712.html
摘要:注意事項聲明函數時候處理業務邏輯區分和單例的區別,配合單例實現初始化構造函數大寫字母開頭推薦注意的成本。簡單工廠模式使用一個類通常為單體來生成實例。 @(書籍閱讀)[JavaScript, 設計模式] 常見設計模式 一直對設計模式不太懂,花了一下午加一晚上的時間,好好的看了看各種設計模式,并總結了一下。 設計模式簡介 設計模式概念解讀 設計模式的發展與在JavaScript中的應用 ...
摘要:在中構造器的典型特點就是首字母大寫,我們通過原對象代理列表格式去創建對象創建的這個對象我們稱之為代理對象。就是原對象是當前的屬性名是代理對象。理解為明星的經理人消極怠工原封不動地轉告外界的信息給明星本身。但是要注意與是兩個不同的對象。 ES6之Proxy proxy的中文有代理的意思。在其他的程序設計語言中這個單詞也具有類似的含義。 它是什么 Proxy是一個構造器。在js中構造器的典...
摘要:享元模式通過分析應用程序的對象,將其解析為內在數據和外在數據,減少對象數量,從而提高程序的性能。通過這種方式進行事件綁定,可以減少事件處理程序的數量,這種方式叫做事件委托,也是運用了享元模式的原理。事件處理程序是公用的內在部分,每個菜單項各 github 全文地址 : YOU-SHOULD-KNOW-JS JavaScript設計模式之外觀模式 概念 外觀模式:為一組復雜子系統接口提...
摘要:今天說一下,單一職責原則。比如,接口的地址本來已經很完美了,但是你的是處女座最討厭處女座非要給路由添加幾個以保證后臺數據的安全。為了過年,我會選擇使用,因為不知道處女座以后會做出什么傻事來。此時的使用動態織入后,可以完美的解決處女座。 在設計模式中,有著幾條視為黃金原則,設計模式都是圍繞黃金原則,對代碼或者說是架構設計做出一些相應的調整,久而久之,GoF 4人組,發現其實有些設計思想可...
閱讀 3626·2021-11-24 09:39
閱讀 2563·2021-11-15 11:37
閱讀 2220·2021-11-11 16:55
閱讀 5221·2021-10-14 09:43
閱讀 3714·2021-10-08 10:05
閱讀 3016·2021-09-13 10:26
閱讀 2334·2021-09-08 09:35
閱讀 3546·2019-08-30 15:55