
proxy.png
環(huán)境:Webstorm
語(yǔ)言:Typescript

proxy-mini.png
代理設(shè)計(jì)模式所屬類型:結(jié)構(gòu)模式
代碼直觀感受:對(duì)一個(gè)對(duì)象進(jìn)行一層封裝,套一層。
優(yōu)缺點(diǎn),看看優(yōu)缺點(diǎn)聯(lián)想使用場(chǎng)景
| 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|
| 提供上層訪問(wèn),隱藏具體實(shí)現(xiàn) | 代碼會(huì)變復(fù)雜,因?yàn)橛锌赡艽嬖诙鄬忧短状?/td> |
| 對(duì)代理的真實(shí)對(duì)象進(jìn)行管理 | |
| 當(dāng)真實(shí)的對(duì)象不可用時(shí),代理對(duì)象可以進(jìn)行快速響應(yīng) | |
| 開閉原則,可以替換真實(shí)對(duì)象 |
具體實(shí)現(xiàn):
/**
* 使用Typescript模擬一個(gè)簡(jiǎn)單的Android ActivityManager代理設(shè)計(jì)模式
*/
interface ActivityManager {
getService():void;
}
class ActivityManagerService implements ActivityManager {
getService(): void {
}
}
class ActivityManagerServiceStub implements ActivityManager{
getService(): void {
console.log('真正對(duì)象的操作=>獲取到了電量管理服務(wù)實(shí)例??!')
}
}
class ActivityManagerServiceProxy implements ActivityManager{
//真正代理的對(duì)象
private realObject: ActivityManager;
//構(gòu)造方法傳遞需要代理的對(duì)象
constructor(activityManager:ActivityManager) {
this.realObject = activityManager;
}
getService(): void {
if (this.checktoken()) {
this.realObject.getService();
this.recordAction();
}
}
private checktoken():boolean{
console.log('來(lái)自代理的操作=>校驗(yàn)當(dāng)前的Token是否正確');
return true;
}
private recordAction(){
console.log('來(lái)自代理的操作=>獲取服務(wù)完成以后進(jìn)行一些記錄操作');
}
}
//創(chuàng)建ActivityManagerServiceStub存根對(duì)象,并添加到代理中
const mActivityManagerServiceProxy = new ActivityManagerServiceProxy(new ActivityManagerServiceStub());
//開始獲取服務(wù)
mActivityManagerServiceProxy.getService();
輸出控制臺(tái)
C:\Users\Aniu\Desktop\github_advanced>node Proxy.js
來(lái)自代理的操作=>校驗(yàn)當(dāng)前的Token是否正確
真正對(duì)象的操作=>獲取到了電量管理服務(wù)實(shí)例?。?來(lái)自代理的操作=>獲取服務(wù)完成以后進(jìn)行一些記錄操作
外觀設(shè)計(jì)模式VS代理設(shè)計(jì)模式
外觀設(shè)計(jì)模式與代理設(shè)計(jì)有相似之處,區(qū)別就是外觀設(shè)計(jì)模式它與真實(shí)對(duì)象沒(méi)有一樣的實(shí)現(xiàn)接口,所以也可聯(lián)想到,外觀真正代理的對(duì)象是沒(méi)有辦法進(jìn)行替換的,更多的是用來(lái)做資源整合,整合多個(gè)對(duì)象的功能,比如有兩個(gè)真實(shí)對(duì)象的功能需要進(jìn)行配合整合,那么就適合使用外觀設(shè)計(jì)模式,外觀設(shè)計(jì)模式與功能的定義單純從名字上來(lái)看是不太易于理解的,但是只要我聯(lián)想到幾個(gè)模塊是平級(jí)的,需要聯(lián)合使用,我就會(huì)想到使用外觀模式進(jìn)行資源整合管理。