代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)
當(dāng)我第一次看到代理模式的定義是,腦海中浮現(xiàn)的一句代碼就是const that = this;,我們通過(guò)that來(lái)代理this的訪問(wèn),雖然沒(méi)有體現(xiàn)控制的意味,但體現(xiàn)了代理的意思。
在日常的開(kāi)發(fā)工作之中,我對(duì)于代理模式的理解是:對(duì)對(duì)象的操作添加過(guò)濾的手段。
之前在工作中遇到一個(gè)場(chǎng)景:平臺(tái)管理系統(tǒng)需要去維護(hù)各子系統(tǒng)的公共數(shù)據(jù)(CommonData),各子系統(tǒng)在使用時(shí)去拉取公共數(shù)據(jù),但是這樣拉取公共數(shù)據(jù)其實(shí)會(huì)是比較大的開(kāi)銷,因?yàn)楣矓?shù)據(jù)的變化比較緩慢,時(shí)效性比較低,我們可以通過(guò)代理拉取公共數(shù)據(jù)的函數(shù)來(lái)操作。代碼如下:
// 拉取公共數(shù)據(jù)函數(shù)
const getCommonData = async (type) => {
return await Ajax(type);
};
// 代理函數(shù)
const CommonDataMap = new Map();
const getCommonDataProxy = async (type) => {
let data = CommonDataMap.get(type);
if (!data) {
data = await getCommonData(type);
CommonDataMap.set(type, data);
}
return data;
};
使用場(chǎng)景
- 遠(yuǎn)程代理:為一個(gè)對(duì)象在不同的地址空間提供局部代表,這樣可以隱藏一個(gè)對(duì)象存在不同地址空間的事實(shí)
- 虛擬代理:根據(jù)需要?jiǎng)?chuàng)建開(kāi)銷很大的對(duì)象,通過(guò)它來(lái)存放實(shí)例化需要很長(zhǎng)時(shí)間的真實(shí)對(duì)象
- 安全代理:用來(lái)控制,真實(shí)對(duì)象訪問(wèn)時(shí)的權(quán)限
- 智能指引:值當(dāng)調(diào)用真實(shí)的對(duì)象時(shí),代理處理另外一些事情
我的經(jīng)驗(yàn)
在前端中,我遇到或使用代理模式的場(chǎng)景有:
- 需要對(duì)某些類、方法的使用做一層過(guò)濾
- 需要監(jiān)聽(tīng)某些類、方法的使用并做處理
- 某些DOM懶加載的情況(比如圖片懶加載)
參考
大話設(shè)計(jì)模式 -- 程杰