對靜態(tài)代理的理解

假如有一個使用賬號密碼登錄功能,我們寫這樣一個類:

public class Login {

    public void print() {
        System.out.println("專注于賬號密碼登錄中...");
    }
}

現(xiàn)在想在登錄之前和之后分別想打點上報,但是打點上報卻不屬于登錄的操作,我們不想把上報的代碼寫在登錄模塊中,于是我們可以這樣寫

public class LoginProxy {

    private Login login;

    public LoginProxy(Login login) {
        this.login = login;
    }

    public void print() {
        System.out.println("在登錄之前上報...");
        login.print();
        System.out.println("在登錄之后上報...");
    }
}

使用方法

    public static void main(String[] args) {
        Login login = new Login();
        LoginProxy loginProxy = new LoginProxy(login);
        loginProxy.print();
    }

這樣在不絲毫影響登錄模塊的情況下實現(xiàn)登錄前后的上報功能,這其實就是靜態(tài)代理的實現(xiàn),Login是被代理對象,LoginProxy是代理對象。
現(xiàn)在增加需求,要實現(xiàn)微信登錄,于是增加一個登錄類

public class WechatLogin {
    public void print() {
        System.out.println("專注于微信登錄中...");
    }
}

代理類

public class WechatLoginProxy {
    private WechatLogin wechatLogin;

    public WechatLoginProxy(WechatLogin wechatLogin) {
        this.wechatLogin = wechatLogin;
    }

    public void print() {
        System.out.println("在登錄之前上報...");
        wechatLogin.print();
        System.out.println("在登錄之后上報...");
    }
}

這時候又增加需求,要實現(xiàn)QQ登錄,于是新建QQLogin、QQLoginProxy......
在使用時太麻煩了,不符合設(shè)計原則,來改造一番。
新增接口:

public interface LoginInterface {
    public void print();
}

改造Login:

public class Login implements LoginInterface{

    @Override
    public void print() {
        System.out.println("專注于賬號密碼登錄中...");
    }
}

改造WechatLogin:

public class WechatLogin implements LoginInterface{
    @Override
    public void print() {
        System.out.println("專注于微信登錄中...");
    }
}

接著改造LoginProxy:

public class LoginProxy implements LoginInterface{

    private LoginInterface login;

    public LoginProxy(LoginInterface login) {
        this.login = login;
    }

    @Override
    public void print() {
        System.out.println("在登錄之前上報...");
        login.print();
        System.out.println("在登錄之后上報...");
    }
}

WechatLoginProxy:

public class WechatLoginProxy {
    private WechatLogin wechatLogin;

    public WechatLoginProxy(WechatLogin wechatLogin) {
        this.wechatLogin = wechatLogin;
    }

    public void print() {
        System.out.println("在登錄之前上報...");
        wechatLogin.print();
        System.out.println("在登錄之后上報...");
    }
}

使用時,想怎么登錄直接傳對應(yīng)構(gòu)造參數(shù)就行了

    public static void main(String[] args) {
        //賬號密碼登錄
        LoginProxy loginProxy = new LoginProxy(new Login());
        loginProxy.print();
        //微信登錄
        LoginProxy wechatProxy = new LoginProxy(new WechatLogin());
        wechatProxy.print();
    }

打印結(jié)果:

在登錄之前上報...
專注于賬號密碼登錄中...
在登錄之后上報...
在登錄之前上報...
專注于微信登錄中...
在登錄之后上報...

到此,一個標(biāo)準(zhǔn)的靜態(tài)代理就出現(xiàn)了,之前查了一些靜態(tài)代理資料,都有一句話:代理對象和被代理對象必須實現(xiàn)同一個接口。個人理解這樣說的太絕對,其實不實現(xiàn)也可以實現(xiàn)靜態(tài)代理的功能和運用原理,實現(xiàn)接口只是為了遵循面向接口編程的設(shè)計原則而已,和靜態(tài)代理沒有關(guān)系。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,351評論 6 13
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,632評論 1 32
  • 情緒的魔咒,失控-恢復(fù)-再次失控,這好像是一個固定的謎題,無解。 當(dāng)我看到它的時候,它也望著我。 越想掌控就越失控...
    白色的世界_409e閱讀 119評論 0 0
  • 作者:張新國 【好員工的基本要求】: 熱情勝于才干,態(tài)度決定一切 敬業(yè)實干發(fā)揮最大價值,主動 把工作當(dāng)人生樂趣,成...
    面包不打烊閱讀 556評論 0 2
  • 夏天過去,天黑的就很早。每天下班時,街燈就開始亮了。 我沒有見過其他顏色的街燈,大部分是昏黃的...
    南宮柳閱讀 668評論 3 2

友情鏈接更多精彩內(nèi)容