亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

設(shè)計(jì)模式之代理模式

zr_hebo / 2529人閱讀

摘要:要解決的問(wèn)題代理模式主要解決的問(wèn)題是將復(fù)雜的操作邏輯隱藏起來(lái),讓方法的使用者只使用幾個(gè)固定的和類方法就可以簡(jiǎn)單的實(shí)現(xiàn)一些功能。可以看出代理模式是將復(fù)雜的邏輯一步一步的封裝到每個(gè)類中,而且每個(gè)類都有自己唯一的職責(zé)。

要解決的問(wèn)題

代理模式主要解決的問(wèn)題是將復(fù)雜的操作邏輯隱藏起來(lái),讓方法的使用者只使用幾個(gè)固定的setget類方法就可以簡(jiǎn)單的實(shí)現(xiàn)一些功能。而且代碼還不失擴(kuò)展性和維護(hù)性。

能解決的常見問(wèn)題

圖片預(yù)加載

一般網(wǎng)頁(yè)上顯示圖片如果直接img標(biāo)簽中寫上src,在用戶訪問(wèn)網(wǎng)頁(yè)時(shí)可能因?yàn)榫W(wǎng)速的原因,會(huì)顯示一大片空白的區(qū)域,這樣容易引起不明真相的用戶的困惑。所以目前一般的網(wǎng)站都會(huì)有圖片預(yù)加載機(jī)制,也就是在真正的圖片在被加載完成之前用一張菊花圖(轉(zhuǎn)圈的gif圖片)表示正在加載圖片。

這是一張圖片標(biāo)題

TS代碼

/* 生成一張圖片 */
class myImg{
    imgNode = document.createElement("img");
    constructor(where:HTMLElement){
        this.appendTo(where);
    };
    private appendTo(where:any){
        where.appendChild(this.imgNode);
    }
    setSrc( src:string ){
        this.imgNode.src = src;
    }
}
/* 封裝一個(gè)類嗲用前一個(gè)類,等待網(wǎng)絡(luò)圖片加載完成之前先設(shè)置一張loading菊花圖,加載完成后將圖片換成該顯示的圖片 */
class PreloadImg extends myImg{
    img = new Image;
    constructor( where: HTMLElement){
        super(where);
    }
    setSrc(src:string){
        super.setSrc("loading.gif")
        this.img.src = src;
        this.img.onload = ()=>{
            super.setSrc(src);
        }
    }
}

/*循環(huán)調(diào)用前一個(gè)類,插入圖片的顯示列表*/
class LoadImgList extends PreloadImg{
    constructor(list:string[],place:HTMLElement){
        super(place);
        list.map((item)=>{
            super.setSrc(item);            
        })
    }
}

/*  Test  */
let place = document.getElementsByTagName("div")[0];
let list = [
    "圖片鏈接1",
    "圖片鏈接2",
    "圖片鏈接3",
];
new LoadImgList(list,place); //插入顯示圖片列表

可以看出上面的代碼實(shí)現(xiàn)的兩層的代理,符合單一職責(zé)的原則
1.myImg類的作用是在指定的位置插入一張圖片,并有setSrc的方法用來(lái)為圖片設(shè)置路徑。
2.PreloadImg類繼承了myImg,作用是用來(lái)在加載圖片的過(guò)程中先顯示一張占位的loading菊花圖,而在圖片加載完畢后將占位菊花圖換成加載下來(lái)的圖片。
3.LoadImgList類繼承了PreloadImg類,作用是用來(lái)將圖片隊(duì)數(shù)組中的圖片鏈接自動(dòng)的加載到圖片要插入的地方。
4.可以看出代理模式是將復(fù)雜的邏輯一步一步的封裝到每個(gè)類中,而且每個(gè)類都有自己唯一的職責(zé)。而用戶只要使用最后的LoadImgList類不用理會(huì)背后的邏輯就可以使用圖片預(yù)加載功能。同時(shí)代碼也具有可擴(kuò)展性和相對(duì)好的可維護(hù)性。

緩存計(jì)算結(jié)果

/* 用到了 單例模式 和 代理模式:用代理模式實(shí)現(xiàn)單例模式實(shí)現(xiàn)計(jì)算的緩存*/

/*負(fù)責(zé)計(jì)算相乘的結(jié)果*/
class Mult{
    protected getResult(...args){
        console.log("開始計(jì)算");
        return args.reduce((x,y)=>{
            return x*y;
        });
    }
}

/*代理Mult類,緩存計(jì)算的內(nèi)容*/
class CacheMult extends Mult{
    cache:object = {};
    constructor(){
        super();
    }
    getResult(...args){
        let sorted_args = args.sort((n1,n2)=>n1-n2);
        let key = sorted_args.join(",")
        if ( key in this.cache ){  //如果結(jié)果已經(jīng)計(jì)算過(guò)了,就返回緩存過(guò)的結(jié)果
            return this.cache[key];
        }else{
            let result = super.getResult(...args);  //調(diào)用父類得到計(jì)算結(jié)果
            this.cache[ key ] = result; //緩存結(jié)果到緩存中
            return result;
        }
    }
}

let mult = new CacheMult();
let r1 = mult.getResult(1,2,3,4);
let r2 = mult.getResult(1,2,3,4);
let r3 = mult.getResult(1,2,3);
console.log(r1);
console.log(r2);
console.log(r3);
/* 運(yùn)行結(jié)果 */
// 開始計(jì)算
// 開始計(jì)算
// 24
// 24
// 6

從上面的代碼中可以看出,CacheMult類代理了Mult類來(lái)事項(xiàng)緩存計(jì)算結(jié)果的功能,防止出現(xiàn)重復(fù)計(jì)算,這樣可以再某一些計(jì)算密集型的場(chǎng)景下有效的節(jié)省計(jì)算資源,提高代碼的性能。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/89959.html

相關(guān)文章

  • PHP設(shè)計(jì)模式代理模式

    摘要:虛擬代理如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來(lái)表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。虛擬代理通過(guò)使用一個(gè)小對(duì)象來(lái)代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。 概念 代理模式(Proxy Pattern) :一種對(duì)象結(jié)構(gòu)型模式。給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。 UML showImg(https://seg...

    zhisheng 評(píng)論0 收藏0
  • 設(shè)計(jì)模式代理模式

    摘要:代理模式的定義來(lái)源于百度百科為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。二來(lái)源大話設(shè)計(jì)模式三例子實(shí)現(xiàn)現(xiàn)在根據(jù)上面購(gòu)票代理的場(chǎng)景來(lái)實(shí)現(xiàn)例子接口,定義真實(shí)火車站,還有代理提供的服務(wù)。一、定義? ? ? ?在網(wǎng)絡(luò)不發(fā)達(dá)之前,我們買火車票,通常都需要跑到火車站去買。這對(duì)于我們來(lái)說(shuō)可能有些麻煩,偶然有一天,你發(fā)現(xiàn)你樓下有一家便利店居然能買火車票,這就方便很多。其實(shí)啊,便利店并不提供火車服務(wù),也沒(méi)有權(quán)...

    enda 評(píng)論0 收藏0
  • Spring框架我見(二)——代理模式

    摘要:聊完了工廠模式,下面我們來(lái)說(shuō)框架中的另一個(gè)核心設(shè)計(jì)模式代理模式。這里的外賣小哥就相當(dāng)于是我們的代理。主要分為代理和代理。 聊完了工廠模式,下面我們來(lái)說(shuō)Spring框架中的另一個(gè)核心設(shè)計(jì)模式——代理模式(Proxy Pattern)。 代理模式 大家可以先不用看概念,先舉個(gè)吃飯的例子:比如說(shuō)我們想吃飯,我們可以選擇自己做飯吃、去飯店吃、叫外賣吃。如果我們選擇自己做著吃,我們就需要去買菜、...

    oneasp 評(píng)論0 收藏0
  • 設(shè)計(jì)模式代理模式

    摘要:虛擬代理虛擬代理把一些開銷很大的對(duì)象,延遲到真正需要它的時(shí)候才去創(chuàng)建。主要參考設(shè)計(jì)模式與開發(fā)實(shí)踐 設(shè)計(jì)模式 在面向?qū)ο筌浖O(shè)計(jì)過(guò)程中針對(duì)特定問(wèn)題的簡(jiǎn)潔而優(yōu)雅的解決方案。 這是在《設(shè)計(jì)模式》一書中對(duì)設(shè)計(jì)模式的定義。在軟件開發(fā)過(guò)程中,我們可能會(huì)遇到過(guò)這樣的情況,我們現(xiàn)在發(fā)現(xiàn)一個(gè)問(wèn)題,和以前的某個(gè)問(wèn)題很相似,幾乎可以用統(tǒng)一套解決方案,而且我們還發(fā)現(xiàn),在某個(gè)條件下,這個(gè)解決方案幾乎就是通用的,...

    Gilbertat 評(píng)論0 收藏0
  • Javascript設(shè)計(jì)模式——代理模式

    摘要:最近在讀設(shè)計(jì)模式與開發(fā)實(shí)踐,在這里把文中的各種設(shè)計(jì)模式寫出來(lái),以便加深記憶,也可以分享給初學(xué)者。經(jīng)紀(jì)人可以全權(quán)代表明星和客戶談判,最后把談判結(jié)果給明星,明星決定簽約與否。這也違反了面向?qū)ο笤O(shè)計(jì)原則中的單一職責(zé)原則。 最近在讀《javascript設(shè)計(jì)模式與開發(fā)實(shí)踐》,在這里把文中的各種設(shè)計(jì)模式寫出來(lái),以便加深記憶,也可以分享給初學(xué)者。如果你不了解設(shè)計(jì)模式,那么強(qiáng)烈推薦你閱讀一下這本書,...

    cuieney 評(píng)論0 收藏0
  • JS設(shè)計(jì)模式代理模式

    摘要:什么是代理模式代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過(guò)經(jīng)紀(jì)人的溝通。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可以說(shuō)在代理模式當(dāng)中,代理是早已既定的。又稱單一功能原則,面向?qū)ο笪鍌€(gè)基本原則之一。 什么是代理模式 代理模式,類似于明星的經(jīng)紀(jì)人,想要拜訪明星,需要先通過(guò)經(jīng)紀(jì)人的溝通。而在JS當(dāng)中,如果想訪問(wèn)一個(gè)類,需要通過(guò)另一個(gè)類來(lái)間接訪問(wèn) 。不同于裝飾器,那種動(dòng)態(tài)加載一個(gè)對(duì)象,可...

    widuu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<