国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《設計模式的藝術》筆記 - 代理模式

這篇具有很好參考價值的文章主要介紹了《設計模式的藝術》筆記 - 代理模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

介紹

? ? ? ? 代理模式是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式是一種對象結(jié)構(gòu)型模式。

實現(xiàn)

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <unordered_map>

class Subject {     // 抽象主題角色
public:
    virtual void request() = 0;
};

class Proxy : public Subject {  // 代理主題角色
public:
    Proxy();
    ~Proxy();

    void request() override;

    void preRequest();

    void postRequest();
private:
    Subject *m_real;
};

class RealSubject : public Subject {
public:
    void request() override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

Proxy::Proxy() {
    m_real = new RealSubject();
}

Proxy::~Proxy() {
    if (m_real) {
        delete m_real;
    }
}

void Proxy::request() {
    if (m_real) {
        preRequest();
        m_real->request();
        postRequest();
    }
}

void Proxy::preRequest() {
    std::cout << "代理請求準備工作" << std::endl;
}

void Proxy::postRequest() {
    std::cout << "代理結(jié)束收尾工作" << std::endl;
}

void RealSubject::request() {
    std::cout << "被代理的請求" << std::endl;
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Subject *proxy = new Proxy();
    proxy->request();
    delete proxy;

    return 0;
}

總結(jié)

優(yōu)點

? ? ? ? 1.?代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度,滿足迪米特法則。

? ? ? ? 2.?客戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改源代碼,符合開閉原則,系統(tǒng)具有較好的靈活性和可擴展性。

? ? ? ? 3.?遠程代理為位于兩個不同地址空間對象的訪問提供了一種實現(xiàn)機制,可以將一些消耗資源較多的對象和操作移至性能更好的計算機上,提高系統(tǒng)的整體運行效率。

? ? ? ? 4.?虛擬代理通過一個消耗資源較少的對象來代表一個消耗資源較多的對象,可以在一定程度上節(jié)省系統(tǒng)的運行開銷。

? ? ? ? 5.?保護代理可以控制對一個對象的訪問權限,為不同用戶提供不同級別的使用權限。

缺點

? ? ? ? 1.?由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢,例如保護代理。

? ? ? ? 2.?實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復雜,例如遠程代理。

適用場景

? ? ? ? 1.?當客戶端對象需要訪問遠程主機中的對象時,可以使用遠程代理。

? ? ? ? 2.?當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統(tǒng)開銷、縮短運行時間時,可以使用虛擬代理。例如一個對象需要很長時間才能完成加載時。

? ? ? ? 3.?當需要控制對一個對象的訪問,為不同用戶提供不同級別的訪問權限時,可以使用保護代理。

? ? ? ? 4.?當需要為某一個被頻繁訪問的操作結(jié)果提供一個臨時存儲空間,以供多個客戶端共享訪問這些結(jié)果時,可以使用緩沖代理。通過緩沖代理,系統(tǒng)無須在客戶端每次訪問時都重新執(zhí)行操作,只需直接從臨時緩沖區(qū)獲取操作結(jié)果即可。

? ? ? ? 5.?當需要為一個對象的訪問(引用)提供一些額外的操作時,可以使用智能引用代理。

練習

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <unordered_map>
#include <atomic>

class Subject {     // 抽象主題角色
public:
    virtual void displayUrl(const std::string &url) = 0;
    virtual void displayPic(const std::string &pic) = 0;
};

class Proxy : public Subject {  // 代理主題角色
public:
    Proxy();
    ~Proxy();

    void displayUrl(const std::string &url) override;
    void displayPic(const std::string &pic) override;

private:
    Subject *m_real;
};

class RealSubject : public Subject {
public:
    void displayUrl(const std::string &url) override;
    void displayPic(const std::string &pic) override;

    void download(const std::string &url);

    bool isDownloadComplete();

private:
    bool m_isDownloaded;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"
#include <thread>
#include <unistd.h>

Proxy::Proxy() {
    m_real = new RealSubject();
}

Proxy::~Proxy() {
    if (m_real) {
        delete m_real;
    }
}

void Proxy::displayUrl(const std::string &url) {
    if (m_real) {
        new std::thread(&Subject::displayUrl, m_real, std::ref(url));
    }
    std::cout << "顯示圖片" << url << std::endl;
}

void Proxy::displayPic(const std::string &pic) {
    if (m_real) {
        m_real->displayPic(pic);
    }
}

void RealSubject::download(const std::string &url) {
    sleep(10);
    std::cout << url << "下載完成" << std::endl;
    m_isDownloaded = true;
}

bool RealSubject::isDownloadComplete() {
    return m_isDownloaded;
}

void RealSubject::displayUrl(const std::string &url) {
    download(url);
}

void RealSubject::displayPic(const std::string &pic) {
    while (!m_isDownloaded) {
        usleep(100000);
    }
    std::cout << "顯示圖片" << pic << std::endl;
}

main.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-804122.html

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Subject *proxy = new Proxy();
    proxy->displayUrl("http://www.123.com/ab.jpg");
    proxy->displayPic("ab.jpg");
    delete proxy;

    return 0;
}

到了這里,關于《設計模式的藝術》筆記 - 代理模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《設計模式的藝術》筆記 - 組合模式

    ? ? ? ? 組合模式組合多個對象形成樹形結(jié)構(gòu)以表示具有“部分-整體”關系的層次結(jié)構(gòu)。組合模式對單個對象(即葉子對象)和組合對象(即容器對象)的使用具有一致性,又可以稱為“部分—整體”(Part-Whole)模式,它是一種對象結(jié)構(gòu)型模式。 myclass.h myclass.cpp main.cpp ?

    2024年01月19日
    瀏覽(15)
  • 《設計模式的藝術》筆記 - 裝飾模式

    ? ? ? ? 裝飾模式動態(tài)地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現(xiàn)更為靈活。裝飾模式是一種對象結(jié)構(gòu)型模式。 ?myclass.h myclass.cpp main.cpp ? ? ? ? 1.?對于擴展一個對象的功能,裝飾模式比繼承更加靈活性,不會導致類的個數(shù)急劇增加

    2024年01月19日
    瀏覽(24)
  • 《設計模式的藝術》筆記 - 命令模式

    ? ? ? ? 命令模式將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數(shù)化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。命令模式是一種對象行為模式,其別名為動作模式或事務模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 只需要增加一個CommandQueue類即可

    2024年01月20日
    瀏覽(29)
  • 《設計模式的藝術》筆記 - 橋接模式

    ? ? ? ? 橋接模式將抽象部分與其實現(xiàn)部分分離,使它們都可以獨立地變化。它是一種對象結(jié)構(gòu)型模式,又稱為柄體模式或接口模式 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?分離抽象接口及其實現(xiàn)部分。橋接模式使用“對象間的關聯(lián)關系”解耦了抽象和實現(xiàn)之間固有的綁定關系,

    2024年01月18日
    瀏覽(23)
  • 《設計模式的藝術》筆記 - 簡單工廠模式

    《設計模式的藝術》筆記 - 簡單工廠模式

    ? ? ? ? 定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實例,被創(chuàng)建的實例通常都具有相同的父類。因為在簡單工廠模式中用于創(chuàng)建實例的方法是靜態(tài)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法模式,屬于類創(chuàng)建型模式 ? ? ? ? 將Factory合并到父類Product中,此時

    2024年01月16日
    瀏覽(21)
  • 《設計模式的藝術》筆記 - 單例模式

    ????????單例模式優(yōu)點是可以確保系統(tǒng)中只存在單個對象實例,缺點是不便擴展,一定程度上違背單一原則,既提供業(yè)務方法,又提供創(chuàng)建對象方法 ? ? ? ? 在類加載的時候就創(chuàng)建好對象,獲取對象時直接返回即可 ? ? ? ? 在類加載的時候沒有創(chuàng)建對象,第一次獲取對象

    2024年02月02日
    瀏覽(18)
  • 《設計模式的藝術》筆記 - 享元模式

    ? ? ? ? 享元模式運用共享技術有效地支持大量細粒度對象的復用。系統(tǒng)只使用少量的對象,而這些對象都很相似,狀態(tài)變化很小,可以實現(xiàn)對象的多次復用。由于享元模式要求能夠共享的對象必須是細粒度對象,因此它又稱為輕量級模式,是一種對象結(jié)構(gòu)型模式。 myclass.

    2024年01月19日
    瀏覽(20)
  • 《設計模式的藝術》筆記 - 抽象工廠模式

    ? ? ? ? 提供了一個創(chuàng)建一系列相關或相互依賴的對象的接口,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,它是一種對象創(chuàng)建型模式。 ? ? ? ? 在抽象工廠模式中,每個具體工廠都提供了多個工廠方法用于產(chǎn)生多種不同類型的產(chǎn)品,這些產(chǎn)品構(gòu)成了一個產(chǎn)品族。

    2024年01月16日
    瀏覽(27)
  • 《設計模式的藝術》筆記 - 建造者模式

    ? ? ? ? 建造者模式將一個復雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。建造這模式是一種對象創(chuàng)建型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 優(yōu)點: ? ? ? ? 1.?在建造者模式中,客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建

    2024年01月16日
    瀏覽(24)
  • 《設計模式的藝術》筆記 - 工廠方法模式

    ? ? ? ? 在簡單工廠模式中,當系統(tǒng)中需要引入新的產(chǎn)品時,由于靜態(tài)工廠方法通過所傳入的參數(shù)的不同來創(chuàng)建不同的產(chǎn)品,這必定要修改工廠類的源代碼,將違背開閉原則。因此,工廠方法模式應運而生。工廠方法模式是定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個

    2024年01月23日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包