05.靜態(tài)代理設(shè)計(jì)模式

05.靜態(tài)代理設(shè)計(jì)模式

目錄介紹

  • 01.靜態(tài)代理模式基礎(chǔ)
    • 1.1 靜態(tài)代理由來(lái)
    • 1.2 靜態(tài)代理定義
    • 1.3 靜態(tài)代理場(chǎng)景
    • 1.4 靜態(tài)代理思考
  • 02.靜態(tài)代理原理與實(shí)現(xiàn)
    • 2.1 羅列一個(gè)場(chǎng)景
    • 2.2 用一個(gè)例子理解代理
    • 2.3 案例演變分析
  • 03.靜態(tài)代理分析
    • 3.1 靜態(tài)代理結(jié)構(gòu)圖
    • 3.2 靜態(tài)代理時(shí)序圖
  • 04.代理模式優(yōu)勢(shì)
    • 4.1 如何降低耦合
    • 4.2 保護(hù)真實(shí)對(duì)象使用權(quán)限
  • 05.靜態(tài)代理不足
    • 5.1 靜態(tài)代理類優(yōu)缺點(diǎn)
    • 5.2 靜態(tài)代理缺乏靈活
    • 5.3 靜態(tài)代理復(fù)用難
    • 5.4 難以動(dòng)態(tài)添加功能
    • 5.5 無(wú)法實(shí)現(xiàn)多態(tài)
    • 5.6 思考一下局限性
    • 5.7 動(dòng)態(tài)代理彌補(bǔ)不足
  • 06.靜態(tài)代理總結(jié)
    • 6.1 總結(jié)一下學(xué)習(xí)
    • 6.2 更多內(nèi)容推薦

推薦一個(gè)好玩網(wǎng)站

一個(gè)最純粹的技術(shù)分享網(wǎng)站,打造精品技術(shù)編程專欄秸妥!編程進(jìn)階網(wǎng)

https://yccoding.com/

01.靜態(tài)代理模式基礎(chǔ)

1.1 靜態(tài)代理由來(lái)

在某些情況下,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象,此時(shí)可以通過(guò)一個(gè)稱之為“代理”的第三者來(lái)實(shí)現(xiàn)間接引用豁状。

代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用诗力,并且可以通過(guò)代理對(duì)象去掉客戶不能看到的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)辜梳。

代理模式的英 文叫做Proxy或Surrogate,它是一種對(duì)象結(jié)構(gòu)型模式搂漠。

1.2 靜態(tài)代理定義

靜態(tài)代理定義是什么?

代理模式(Proxy Pattern) :為了隱藏與保護(hù)目標(biāo)對(duì)象某弦,給某一個(gè)對(duì)象提供一個(gè)代理桐汤,并由代理對(duì)象控制對(duì)原對(duì)象的引用而克。

1.3 靜態(tài)代理場(chǎng)景

靜態(tài)代理使用場(chǎng)景

代理模式常用在業(yè)務(wù)系統(tǒng)中開(kāi)發(fā)一些非功能性需求,比如:監(jiān)控怔毛、統(tǒng)計(jì)拍摇、鑒權(quán)、限流馆截、事務(wù)充活、冪等、日志蜡娶。

我們將這些附加功能與業(yè)務(wù)功能解耦混卵,放到代理類統(tǒng)一處理,讓程序員只需要關(guān)注業(yè)務(wù)方面的開(kāi)發(fā)窖张。除此之外幕随,代理模式還可以用在 RPC、緩存等應(yīng)用場(chǎng)景中宿接。

1.4 靜態(tài)代理思考

思考一下:代理類和被代理類的關(guān)系赘淮?

靜態(tài)代理中,代理類和被代理類之間的關(guān)系在編譯時(shí)就已經(jīng)確定睦霎。需要考慮代理類和被代理類之間的接口或繼承關(guān)系梢卸,以確保代理類能夠正確地代理被代理類的功能。

思考一下:代理類的責(zé)任副女?

代理類在靜態(tài)代理中充當(dāng)了中介的角色蛤高,負(fù)責(zé)將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給被代理類,并在必要時(shí)添加額外的功能或控制碑幅。需要考慮代理類應(yīng)該承擔(dān)的責(zé)任戴陡,以及如何在代理類中實(shí)現(xiàn)這些責(zé)任。

思考一下:代理類的性能和效率沟涨?

靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系恤批,因此在運(yùn)行時(shí)不需要進(jìn)行額外的動(dòng)態(tài)代理操作。這可能會(huì)帶來(lái)一些性能和效率上的優(yōu)勢(shì)裹赴,但也需要考慮代理類的創(chuàng)建和銷毀成本喜庞,以及代理類對(duì)系統(tǒng)性能的影響。

思考一下:代理類的擴(kuò)展性和維護(hù)性篮昧?

靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系赋荆,因此在需要代理多個(gè)類或接口時(shí),就需要編寫多個(gè)代理類懊昨。這可能會(huì)導(dǎo)致代碼冗余和維護(hù)困難窄潭。需要考慮如何設(shè)計(jì)代理類,以提高代碼的擴(kuò)展性和維護(hù)性。

02.靜態(tài)代理原理與實(shí)現(xiàn)

2.1 羅列一個(gè)場(chǎng)景

第一個(gè)類比:代理對(duì)象是中介嫉你,原對(duì)象是房東的房子月帝,客戶就是我們需要找房的人。

房東的房子讓中介代理出租幽污,中介可以直接控制房子出租嚷辅,用戶是不能找房東直接租房子的,而是要間接通過(guò)中介租房子距误。

第二個(gè)類比:代理對(duì)象是售票點(diǎn)簸搞,原對(duì)象是火車站,客戶就是需要買票的乘客准潭。

我們購(gòu)買火車票可以去火車站買趁俊,但是也可以去火車票代售處買,此處的火車票代售處就是火車站購(gòu)票的代理刑然,即我們?cè)诖埸c(diǎn)發(fā)出買票請(qǐng)求寺擂,代售點(diǎn)會(huì)把請(qǐng)求發(fā)給火車站,火車站把購(gòu)買成功響應(yīng)發(fā)給代售點(diǎn)泼掠,代售點(diǎn)再告訴你怔软。

但是代售點(diǎn)只能買票,不能退票择镇,而火車站能買票也能退票挡逼,因此代理對(duì)象支持的操作可能和委托對(duì)象的操作有所不同。

第三個(gè)類比:代理對(duì)象是vpn沐鼠,原對(duì)象是國(guó)外網(wǎng)站挚瘟,客戶就是需要翻墻上網(wǎng)的人叹谁。

(1)用戶把HTTP請(qǐng)求發(fā)給代理饲梭;(2)代理把HTTP請(qǐng)求發(fā)給web服務(wù)器;(3)web服務(wù)器把HTTP響應(yīng)發(fā)給代理焰檩;(4)代理把HTTP響應(yīng)發(fā)回給用戶

2.2 用一個(gè)例子理解代理

實(shí)現(xiàn)模式

  1. 首先創(chuàng)建一個(gè)接口(代理都是面向接口的)憔涉,
  2. 創(chuàng)建具體實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)這個(gè)接口,
  3. 創(chuàng)建一個(gè)代理類同樣實(shí)現(xiàn)這個(gè)接口析苫,不同之處在于具體實(shí)現(xiàn)類的方法中需要將接口中定義的方法的業(yè)務(wù)邏輯功能實(shí)現(xiàn)兜叨,而代理類中的方法只要調(diào)用具體類中的對(duì)應(yīng)方法即可,這樣我們?cè)谛枰褂媒涌谥械哪硞€(gè)方法的功能時(shí)直接調(diào)用代理類的方法即可衩侥,將具體的實(shí)現(xiàn)類隱藏在底層国旷。

舉一個(gè)實(shí)際案例

  1. 定義用戶找房子的需求接口
  2. 創(chuàng)建用戶找房子具體實(shí)現(xiàn)類
  3. 創(chuàng)建一個(gè)代理中介,委托中介去找房子

代碼如下所示茫死,可以了解到跪但,靜態(tài)代理可以通過(guò)聚合來(lái)實(shí)現(xiàn),讓代理類持有一個(gè)委托類的引用即可峦萎。代碼案例放到GitHub上屡久,設(shè)計(jì)模式代碼案例

/**
 * 靜態(tài)代理偽代碼
 */
private void testProxy() {
    //1.創(chuàng)建委托對(duì)象
    RealSubject subject = new RealSubject();
    //2.創(chuàng)建調(diào)用處理器對(duì)象
    MyProxy p = new MyProxy(subject);
    //3.通過(guò)代理對(duì)象調(diào)用方法
    p.request();
}

/**
 * 代理類和委托類會(huì)實(shí)現(xiàn)接口
 */
interface Subject{
    void request();
}

/**
 * 委托類
 */
class RealSubject implements Subject{
    @Override
    public void request(){
        System.out.println("request");
    }
}

/**
 * 代理
 */
class Proxy implements Subject{
    private Subject subject;
    public Proxy(Subject subject){
        this.subject = subject;
    }
    @Override
    public void request(){
        System.out.println("PreProcess");
        subject.request();
        System.out.println("PostProcess");
    }
}

2.3 案例演變分析

考慮一下這個(gè)需求:

給委托類增加一個(gè)過(guò)濾功能忆首,只租房給我們這類逗比程序員。通過(guò)靜態(tài)代理被环,我們無(wú)需修改委托類的代碼就可以實(shí)現(xiàn)糙及,只需在代理類中的方法中添加一個(gè)判斷即可如下所示:

class MyProxy implements Subject {
    private Subject subject;
    public MyProxy(Subject subject){
        this.subject = subject;
    }
    @Override
    public void request(){
        //判斷是否是逗比程序員
        if (isDouBi){
            System.out.println("PreProcess");
            subject.request();
            System.out.println("PostProcess");
        }
    }
}

使用代理的第二個(gè)優(yōu)點(diǎn):

可以實(shí)現(xiàn)客戶與委托類間的解耦,在不修改委托類代碼的情況下能夠做一些額外的處理筛欢。靜態(tài)代理的局限在于運(yùn)行前必須編寫好代理類浸锨。

03.靜態(tài)代理分析

3.1 靜態(tài)代理結(jié)構(gòu)圖

代理模式包含如下角色:

  1. Subject: 抽象主題角色
  2. Proxy: 代理主題角色
  3. RealSubject: 真實(shí)主題角色

靜態(tài)代理結(jié)構(gòu)圖

[圖片上傳失敗...(image-60c2ea-1729781510969)]

3.2 靜態(tài)代理時(shí)序圖

靜態(tài)代理時(shí)序圖如下所示

[圖片上傳失敗...(image-9a8424-1729781510969)]

04.代理模式優(yōu)勢(shì)

4.1 如何降低耦合

一個(gè)簡(jiǎn)單的案例,演示了如何使用靜態(tài)代理來(lái)降低耦合:

假設(shè)我們有一個(gè)郵件發(fā)送的接口 MailSender版姑,以及一個(gè)實(shí)現(xiàn)該接口的具體類 RealMailSender揣钦。

現(xiàn)在我們想要在發(fā)送郵件之前記錄日志,但又不想直接修改 RealMailSender 類漠酿。這時(shí)可以使用靜態(tài)代理來(lái)實(shí)現(xiàn):

// 定義郵件發(fā)送接口
interface MailSender {
    void sendMail(String recipient, String message);
}

// 實(shí)現(xiàn)郵件發(fā)送接口的具體類
class RealMailSender implements MailSender {
    public void sendMail(String recipient, String message) {
        System.out.println("Sending mail to " + recipient + ": " + message);
    }
}

// 靜態(tài)代理類
class MailSenderProxy implements MailSender {
    private RealMailSender realMailSender;

    public MailSenderProxy() {
        this.realMailSender = new RealMailSender();
    }

    public void sendMail(String recipient, String message) {
        System.out.println("Logging mail sending...");
        realMailSender.sendMail(recipient, message);
    }
}
    
// 使用示例
public class Main {
    public static void main(String[] args) {
        MailSender mailSender = new MailSenderProxy();
        mailSender.sendMail("example@example.com", "Hello, world!");
    }
}

代碼案例分析冯凹,它降低耦合的設(shè)計(jì)思想是什么

通過(guò)使用靜態(tài)代理,我們可以在不修改 RealMailSender 類的情況下炒嘲,為郵件發(fā)送操作添加額外的功能宇姚。這樣,RealMailSender 類和 MailSenderProxy 類之間的耦合度降低夫凸,客戶端只需要與 MailSender 接口進(jìn)行交互浑劳,而不需要關(guān)心具體的實(shí)現(xiàn)類。

靜態(tài)代理可以通過(guò)以下方式降低耦合:

  1. 接口抽象:定義一個(gè)接口夭拌,代理類和被代理類都實(shí)現(xiàn)該接口魔熏。通過(guò)接口的抽象,代理類和被代理類之間的耦合度降低鸽扁,客戶端只需要與接口進(jìn)行交互蒜绽,而不需要關(guān)心具體的實(shí)現(xiàn)類。
  2. 代理類作為中介:代理類作為客戶端和被代理類之間的中介桶现,將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給被代理類躲雅。這樣,客戶端只需要與代理類進(jìn)行交互骡和,而不需要直接與被代理類進(jìn)行交互相赁,從而降低了客戶端與被代理類之間的耦合。
  3. 面向接口編程:在客戶端代碼中慰于,盡量使用接口類型來(lái)聲明變量钮科,而不是具體的實(shí)現(xiàn)類。這樣可以使客戶端與具體的代理類解耦婆赠,提高代碼的靈活性和可擴(kuò)展性绵脯。
  4. 使用依賴注入:通過(guò)依賴注入的方式,將代理對(duì)象注入到客戶端中,而不是在客戶端代碼中直接創(chuàng)建代理對(duì)象桨嫁。這樣可以將代理對(duì)象的創(chuàng)建和配置與客戶端代碼解耦植兰,提高代碼的可維護(hù)性和可測(cè)試性。

4.2 保護(hù)真實(shí)對(duì)象使用權(quán)限

靜態(tài)代理可以用于保護(hù)真實(shí)對(duì)象的使用權(quán)限璃吧。

通過(guò)代理類楣导,可以在訪問(wèn)真實(shí)對(duì)象之前或之后執(zhí)行一些額外的操作,例如權(quán)限驗(yàn)證畜挨、身份驗(yàn)證等筒繁,以確保只有具有適當(dāng)權(quán)限的用戶可以訪問(wèn)真實(shí)對(duì)象。

以下是一個(gè)簡(jiǎn)單的示例巴元,演示了如何使用靜態(tài)代理來(lái)保護(hù)真實(shí)對(duì)象的使用權(quán)限:

  • Image接口定義了display方法毡咏,RealImage類實(shí)現(xiàn)了該接口并表示真實(shí)對(duì)象。ImageProxy類也實(shí)現(xiàn)了Image接口逮刨,并在display方法中創(chuàng)建或使用真實(shí)對(duì)象呕缭。
  • 通過(guò)ImageProxy類,我們可以在訪問(wèn)真實(shí)對(duì)象之前進(jìn)行權(quán)限驗(yàn)證或其他操作修己。只有在真正需要顯示圖像時(shí)恢总,真實(shí)對(duì)象才會(huì)被加載和顯示,從而保護(hù)了真實(shí)對(duì)象的使用權(quán)限睬愤。
private static void proxyImage() {
    Image image = new ImageProxy("image.jpg");
    // 只有在調(diào)用display方法時(shí)片仿,真實(shí)對(duì)象才會(huì)被加載和顯示
    image.display();
}


// 定義接口
interface Image {
    void display();
}

// 定義真實(shí)對(duì)象
static class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk();
    }

    private void loadFromDisk() {
        System.out.println("Loading image from disk: " + filename);
    }

    public void display() {
        System.out.println("Displaying image: " + filename);
    }
}
// 定義代理類
static class ImageProxy implements Image {
    private String filename;
    private RealImage realImage;

    public ImageProxy(String filename) {
        this.filename = filename;
    }

    public void display() {
        if (realImage == null) {
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}

05.靜態(tài)代理不足

5.1 靜態(tài)代理類優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

業(yè)務(wù)類只需要關(guān)注業(yè)務(wù)邏輯本身,保證了業(yè)務(wù)類的重用性尤辱。這是代理的共有優(yōu)點(diǎn)砂豌。

缺點(diǎn):

  1. 1)代理對(duì)象的一個(gè)接口只服務(wù)于一種類型的對(duì)象,如果要代理的方法很多光督,勢(shì)必要為每一種方法都進(jìn)行代理阳距,靜態(tài)代理在程序規(guī)模稍大時(shí)就無(wú)法勝任了。
  2. 2)如果接口增加一個(gè)方法可帽,除了所有實(shí)現(xiàn)類需要實(shí)現(xiàn)這個(gè)方法外娄涩,所有代理類也需要實(shí)現(xiàn)此方法。增加了代碼維護(hù)的復(fù)雜度映跟。

5.2 靜態(tài)代理缺乏靈活

靜態(tài)代理缺乏靈活說(shuō)明:

靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系,因此無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)地改變代理行為扬虚。而動(dòng)態(tài)代理允許在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理對(duì)象努隙,并可以根據(jù)需要?jiǎng)討B(tài)地改變代理行為,提供更大的靈活性辜昵。

5.3 靜態(tài)代理復(fù)用難

代碼復(fù)用難荸镊,會(huì)導(dǎo)致代碼龐大:

靜態(tài)代理需要為每個(gè)被代理類編寫一個(gè)代理類,當(dāng)需要代理多個(gè)類時(shí),會(huì)導(dǎo)致代碼冗余躬存。而動(dòng)態(tài)代理可以通過(guò)一個(gè)通用的代理類來(lái)代理多個(gè)類张惹,實(shí)現(xiàn)代碼的復(fù)用。

5.4 難以動(dòng)態(tài)添加功能

靜態(tài)代理動(dòng)態(tài)添加功能:

靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系岭洲,無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)地添加額外的功能宛逗。而動(dòng)態(tài)代理可以在運(yùn)行時(shí)動(dòng)態(tài)地為被代理對(duì)象添加額外的功能,例如日志記錄盾剩、性能監(jiān)控藻茂、事務(wù)管理等惕鼓。

5.5 無(wú)法實(shí)現(xiàn)多態(tài)

靜態(tài)代理無(wú)法滿足多態(tài)性:

靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系,無(wú)法實(shí)現(xiàn)多態(tài)性。而動(dòng)態(tài)代理可以基于接口或基類來(lái)創(chuàng)建代理對(duì)象叶雹,實(shí)現(xiàn)多態(tài)性,使得代理對(duì)象可以替代被代理對(duì)象的使用友扰。

5.6 思考一下局限性

如果要按照上述的方法使用代理模式批糟,那么真實(shí)角色(委托類)必須是事先已經(jīng)存在的,并將其作為代理對(duì)象的內(nèi)部屬性蜀撑。

但是實(shí)際使用時(shí)番挺,一個(gè)真實(shí)角色必須對(duì)應(yīng)一個(gè)代理角色,如果大量使用會(huì)導(dǎo)致類的急劇膨脹屯掖;此外玄柏,如果事先并不知道真實(shí)角色(委托類),該如何使用代理呢贴铜?這個(gè)問(wèn)題可以通過(guò)Java的動(dòng)態(tài)代理類來(lái)解決粪摘。

5.7 動(dòng)態(tài)代理彌補(bǔ)不足

  1. 代碼復(fù)用:動(dòng)態(tài)代理可以通過(guò)一個(gè)通用的代理類來(lái)代理多個(gè)類,實(shí)現(xiàn)代碼的復(fù)用绍坝。不需要為每個(gè)被代理類編寫一個(gè)代理類徘意,減少了代碼的冗余。
  2. 靈活性和擴(kuò)展性:動(dòng)態(tài)代理在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理對(duì)象轩褐,并可以根據(jù)需要?jiǎng)討B(tài)地添加椎咧、修改或刪除代理行為。這使得代理行為可以根據(jù)不同的需求進(jìn)行定制和擴(kuò)展把介,提供了更大的靈活性和擴(kuò)展性勤讽。
  3. 解耦合:動(dòng)態(tài)代理通過(guò)使用接口或基類來(lái)代理對(duì)象,實(shí)現(xiàn)了代理類和被代理類之間的松耦合拗踢〗烹梗客戶端只需要與代理對(duì)象進(jìn)行交互,無(wú)需關(guān)心具體的實(shí)現(xiàn)類巢墅,提高了代碼的可維護(hù)性和可擴(kuò)展性诸狭。

總結(jié)起來(lái)券膀,靜態(tài)代理在一些簡(jiǎn)單的場(chǎng)景下可以使用,但在需要更大的靈活性驯遇、擴(kuò)展性和可維護(hù)性時(shí)芹彬,動(dòng)態(tài)代理更為適合

06.靜態(tài)代理總結(jié)

6.1 總結(jié)一下學(xué)習(xí)

01.靜態(tài)代理模式基礎(chǔ)

由來(lái)和背景:在某些情況下叉庐,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象舒帮,此時(shí)可以通過(guò)一個(gè)稱之為“代理”的第三者來(lái)實(shí)現(xiàn)間接引用。比如以下場(chǎng)景就適合用代理模式

  1. 個(gè)人眨唬,通過(guò)中介來(lái)找房東發(fā)布的租房会前。
  2. 乘客,通過(guò)火車站來(lái)購(gòu)買鐵路局的車票匾竿。
  3. 客戶瓦宜,通過(guò)VPN代理來(lái)翻墻查閱國(guó)外資料。

一句話概括就是:代理模式(Proxy Pattern) :給某一個(gè)對(duì)象提供一個(gè)代理岭妖,并由代理對(duì)象控制對(duì)原對(duì)象的引用临庇。

靜態(tài)代理使用場(chǎng)景:監(jiān)控、統(tǒng)計(jì)昵慌、鑒權(quán)假夺,日志等場(chǎng)景。附加功能與業(yè)務(wù)功能解耦斋攀,放到代理類統(tǒng)一處理已卷,讓程序員只需要關(guān)注業(yè)務(wù)方面的開(kāi)發(fā)!

02.靜態(tài)代理原理與實(shí)現(xiàn)

實(shí)現(xiàn)模式

  1. 首先創(chuàng)建一個(gè)接口(代理都是面向接口的)淳蔼,
  2. 創(chuàng)建具體實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)這個(gè)接口侧蘸,
  3. 創(chuàng)建一個(gè)代理類同樣實(shí)現(xiàn)這個(gè)接口,不同之處在于具體實(shí)現(xiàn)類的方法中需要將接口中定義的方法的業(yè)務(wù)邏輯功能實(shí)現(xiàn)鹉梨,而代理類中的方法只要調(diào)用具體類中的對(duì)應(yīng)方法即可讳癌,這樣我們?cè)谛枰褂媒涌谥械哪硞€(gè)方法的功能時(shí)直接調(diào)用代理類的方法即可,將具體的實(shí)現(xiàn)類隱藏在底層存皂。

舉一個(gè)實(shí)際案例

  1. 定義用戶找房子的需求接口
  2. 創(chuàng)建用戶找房子具體實(shí)現(xiàn)類
  3. 創(chuàng)建一個(gè)代理中介晌坤,委托中介去找房子

03.靜態(tài)代理分析

代理模式包含如下角色:

  1. Subject: 抽象主題角色
  2. Proxy: 代理主題角色
  3. RealSubject: 真實(shí)主題角色

04.代理模式優(yōu)勢(shì)

  1. 使用靜態(tài)代理來(lái)降低耦合。比如旦袋,郵件發(fā)送的接口 MailSender骤菠,以及一個(gè)實(shí)現(xiàn)該接口的具體類 RealMailSender〔略鳎可以在不修改 RealMailSender 類的情況下娩怎,為郵件發(fā)送操作添加額外的功能。這樣胰柑,RealMailSender 類和 MailSenderProxy 類之間的耦合度降低截亦,客戶端只需要與 MailSender 接口進(jìn)行交互,而不需要關(guān)心具體的實(shí)現(xiàn)類柬讨。
  2. 靜態(tài)代理可以用于保護(hù)真實(shí)對(duì)象的使用權(quán)限崩瓤。在真正需要顯示圖像時(shí),真實(shí)對(duì)象才會(huì)被加載和顯示踩官,從而保護(hù)了真實(shí)對(duì)象的使用權(quán)限却桶。

05.靜態(tài)代理不足

  1. 靜態(tài)代理缺乏靈活說(shuō)明
  2. 代碼復(fù)用難,會(huì)導(dǎo)致代碼龐大
  3. 難以動(dòng)態(tài)添加功能
  4. 靜態(tài)代理無(wú)法滿足多態(tài)性

6.2 更多內(nèi)容推薦

模塊 描述 備注
GitHub 多個(gè)YC系列開(kāi)源項(xiàng)目蔗牡,包含Android組件庫(kù)颖系,以及多個(gè)案例 GitHub
博客匯總 匯聚Java,Android辩越,C/C++嘁扼,網(wǎng)絡(luò)協(xié)議,算法黔攒,編程總結(jié)等 YCBlogs
設(shè)計(jì)模式 六大設(shè)計(jì)原則趁啸,23種設(shè)計(jì)模式,設(shè)計(jì)模式案例督惰,面向?qū)ο笏枷?/td> 設(shè)計(jì)模式
Java進(jìn)階 數(shù)據(jù)設(shè)計(jì)和原理不傅,面向?qū)ο蠛诵乃枷耄琁O赏胚,異常访娶,線程和并發(fā),JVM Java高級(jí)
網(wǎng)絡(luò)協(xié)議 網(wǎng)絡(luò)實(shí)際案例觉阅,網(wǎng)絡(luò)原理和分層崖疤,Https,網(wǎng)絡(luò)請(qǐng)求留拾,故障排查 網(wǎng)絡(luò)協(xié)議
計(jì)算機(jī)原理 計(jì)算機(jī)組成結(jié)構(gòu)戳晌,框架,存儲(chǔ)器痴柔,CPU設(shè)計(jì)沦偎,內(nèi)存設(shè)計(jì),指令編程原理咳蔚,異常處理機(jī)制豪嚎,IO操作和原理 計(jì)算機(jī)基礎(chǔ)
學(xué)習(xí)C編程 C語(yǔ)言入門級(jí)別系統(tǒng)全面的學(xué)習(xí)教程,學(xué)習(xí)三到四個(gè)綜合案例 C編程
C++編程 C++語(yǔ)言入門級(jí)別系統(tǒng)全面的教學(xué)教程谈火,并發(fā)編程侈询,核心原理 C++編程
算法實(shí)踐 專欄,數(shù)組糯耍,鏈表扔字,棧囊嘉,隊(duì)列,樹(shù)革为,哈希扭粱,遞歸,查找震檩,排序等 Leetcode
Android 基礎(chǔ)入門琢蛤,開(kāi)源庫(kù)解讀,性能優(yōu)化抛虏,F(xiàn)ramework博其,方案設(shè)計(jì) Android

23種設(shè)計(jì)模式

23種設(shè)計(jì)模式 & 描述 & 核心作用 包括
創(chuàng)建型模式
提供創(chuàng)建對(duì)象用例。能夠?qū)④浖K中對(duì)象的創(chuàng)建和對(duì)象的使用分離
工廠模式(Factory Pattern)
抽象工廠模式(Abstract Factory Pattern)
單例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
結(jié)構(gòu)型模式
關(guān)注類和對(duì)象的組合迂猴。描述如何將類或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu)
適配器模式(Adapter Pattern)
橋接模式(Bridge Pattern)
過(guò)濾器模式(Filter慕淡、Criteria Pattern)
組合模式(Composite Pattern)
裝飾器模式(Decorator Pattern)
外觀模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行為型模式
特別關(guān)注對(duì)象之間的通信。主要解決的就是“類或?qū)ο笾g的交互”問(wèn)題
責(zé)任鏈模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解釋器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
備忘錄模式(Memento Pattern)
觀察者模式(Observer Pattern)
狀態(tài)模式(State Pattern)
空對(duì)象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
訪問(wèn)者模式(Visitor Pattern)

6.3 更多內(nèi)容

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末错忱,一起剝皮案震驚了整個(gè)濱河市儡率,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌以清,老刑警劉巖儿普,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掷倔,居然都是意外死亡眉孩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門勒葱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浪汪,“玉大人,你說(shuō)我怎么就攤上這事凛虽∷涝猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵凯旋,是天一觀的道長(zhǎng)呀潭。 經(jīng)常有香客問(wèn)我,道長(zhǎng)至非,這世上最難降的妖魔是什么钠署? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮荒椭,結(jié)果婚禮上谐鼎,老公的妹妹穿的比我還像新娘。我一直安慰自己趣惠,他們只是感情好狸棍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布身害。 她就那樣靜靜地躺著,像睡著了一般隔缀。 火紅的嫁衣襯著肌膚如雪题造。 梳的紋絲不亂的頭發(fā)上傍菇,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天猾瘸,我揣著相機(jī)與錄音,去河邊找鬼丢习。 笑死牵触,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咐低。 我是一名探鬼主播揽思,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼见擦!你這毒婦竟也來(lái)了钉汗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲤屡,失蹤者是張志新(化名)和其女友劉穎损痰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體酒来,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卢未,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堰汉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽社。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖翘鸭,靈堂內(nèi)的尸體忽然破棺而出滴铅,到底是詐尸還是另有隱情,我是刑警寧澤就乓,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布汉匙,位于F島的核電站,受9級(jí)特大地震影響档址,放射性物質(zhì)發(fā)生泄漏盹兢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一守伸、第九天 我趴在偏房一處隱蔽的房頂上張望绎秒。 院中可真熱鬧,春花似錦尼摹、人聲如沸见芹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玄呛。三九已至阅懦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徘铝,已是汗流浹背耳胎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惕它,地道東北人怕午。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像淹魄,于是被迫代替她去往敵國(guó)和親郁惜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容