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

《設(shè)計(jì)模式的藝術(shù)》筆記 - 裝飾模式

這篇具有很好參考價(jià)值的文章主要介紹了《設(shè)計(jì)模式的藝術(shù)》筆記 - 裝飾模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

介紹

? ? ? ? 裝飾模式動(dòng)態(tài)地給一個(gè)對(duì)象增加一些額外的職責(zé),就增加對(duì)象功能來說,裝飾模式比生成子類實(shí)現(xiàn)更為靈活。裝飾模式是一種對(duì)象結(jié)構(gòu)型模式。

實(shí)現(xiàn)

?myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <vector>

class Component {   // 抽象構(gòu)件
public:
    virtual void display();
};

class ConcreteComponent : public Component {    // 具體構(gòu)件
public:
    void display() override;
};

class Decorator : public Component {   // 抽象裝飾類
public:
    Decorator(Component *component);
    virtual void display();

private:
    Component *m_component;
};

class ConcreteDecorator : public Decorator {    // 具體裝飾類
public:
    ConcreteDecorator(Component *component);

    void display() override;

private:
    void addedBehavior();
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

void Component::display() {
    std::cout << "Component::display()" << std::endl;
}

void ConcreteComponent::display() {
    std::cout << "ConcreteComponent::display()" << std::endl;
}

Decorator::Decorator(Component *component) {
    m_component = component;
}

void Decorator::display() {
    m_component->display();
}

ConcreteDecorator::ConcreteDecorator(Component *component) : Decorator(component) {

}

void ConcreteDecorator::display() {
    Decorator::display();
    addedBehavior();
}

void ConcreteDecorator::addedBehavior() {
    std::cout << "增加新的操作" << std::endl;
}

main.cpp

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

int main() {
    Component *component = new ConcreteComponent();
    Decorator *decorator = new ConcreteDecorator(component);
    decorator->display();
    delete component;
    delete decorator;

    return 0;
}

總結(jié)

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

? ? ? ? 1.?對(duì)于擴(kuò)展一個(gè)對(duì)象的功能,裝飾模式比繼承更加靈活性,不會(huì)導(dǎo)致類的個(gè)數(shù)急劇增加。

? ? ? ? 2.?可以通過一種動(dòng)態(tài)的方式來擴(kuò)展一個(gè)對(duì)象的功能。通過配置文件可以在運(yùn)行時(shí)選擇不同的具體裝飾類,從而實(shí)現(xiàn)不同的行為。

? ? ? ? 3.?可以對(duì)一個(gè)對(duì)象進(jìn)行多次裝飾。通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創(chuàng)造出很多不同行為的組合,得到功能更為強(qiáng)大的對(duì)象。

? ? ? ? 4.?具體構(gòu)件類與具體裝飾類可以獨(dú)立變化,用戶可以根據(jù)需要增加新的具體構(gòu)件類和具體裝飾類,原有類庫代碼無須改變,符合開閉原則。

缺點(diǎn)

? ? ? ? 1.?使用裝飾模式進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)將產(chǎn)生很多小對(duì)象。這些對(duì)象的區(qū)別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同。大量小對(duì)象的產(chǎn)生勢必會(huì)占用更多的系統(tǒng)資源,在一定程度上影響程序的性能。

? ? ? ? 2.?裝飾模式提供了一種比繼承更加靈活機(jī)動(dòng)的解決方案,但同時(shí)也意味著比繼承更加易于出錯(cuò),排錯(cuò)也很困難。對(duì)于多次裝飾的對(duì)象,調(diào)試時(shí)尋找錯(cuò)誤可能需要逐級(jí)排查,較為煩瑣。

適用場景

? ? ? ? 1.?在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。

? ? ? ? 2.?當(dāng)不能采用繼承的方式對(duì)系統(tǒng)進(jìn)行擴(kuò)展或者采用繼承不利于系統(tǒng)擴(kuò)展和維護(hù)時(shí)可以使用裝飾模式。不能采用繼承的情況主要有兩類:第1類是系統(tǒng)中存在大量獨(dú)立的擴(kuò)展,為支持每一種擴(kuò)展或者擴(kuò)展之間的組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長;第2類是因?yàn)轭愐讯x為不能被繼承。

練習(xí)

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>
#include <vector>

class SimpleEncrypt {   // 具體構(gòu)件類
public:
    virtual void encrypt(std::string &in, std::string &out);
};

class EncryptDecorator : public SimpleEncrypt {   // 抽象裝飾類
public:
    EncryptDecorator(SimpleEncrypt *encypt);
    virtual void encrypt(std::string &in, std::string &out) override;

private:
    SimpleEncrypt *m_encrypt;
};


class ReverseEncrypt : public EncryptDecorator {    // 具體裝飾類
public:
    ReverseEncrypt(SimpleEncrypt *encrypt);

    void encrypt(std::string &in, std::string &out) override;

private:
    void reverseEncrypt(std::string &in, std::string &out);
};

class ModEncrypt : public EncryptDecorator {    // 具體裝飾類
public:
    ModEncrypt(SimpleEncrypt *encrypt);

    void encrypt(std::string &in, std::string &out) override;

private:
    void modEncrypt(std::string &in, std::string &out);
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

void SimpleEncrypt::encrypt(std::string &in, std::string &out) {
    std::cout << "執(zhí)行簡單加密" << std::endl;
    out = "簡單加密+" + in;
}

EncryptDecorator::EncryptDecorator(SimpleEncrypt *encypt) {
    m_encrypt = encypt;
}

void EncryptDecorator::encrypt(std::string &in, std::string &out) {
    m_encrypt->encrypt(in, out);
}

ReverseEncrypt::ReverseEncrypt(SimpleEncrypt *encrypt) : EncryptDecorator(encrypt) {
}

void ReverseEncrypt::encrypt(std::string &in, std::string &out) {
    std::string tmp;
    EncryptDecorator::encrypt(in, tmp);
    reverseEncrypt(tmp, out);
}

void ReverseEncrypt::reverseEncrypt(std::string &in, std::string &out) {
    std::cout << "執(zhí)行逆向加密" << std::endl;
    out = "逆向加密+" + in;
}

ModEncrypt::ModEncrypt(SimpleEncrypt *encrypt) : EncryptDecorator(encrypt) {

}

void ModEncrypt::encrypt(std::string &in, std::string &out) {
    std::string tmp;
    EncryptDecorator::encrypt(in, tmp);
    modEncrypt(tmp, out);
}

void ModEncrypt::modEncrypt(std::string &in, std::string &out) {
    std::cout << "執(zhí)行取模加密" << std::endl;
    out = "取模加密+" + in;
}

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

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

int main() {
    std::string data = "data";
    std::string result;

    SimpleEncrypt *sim = new SimpleEncrypt();
    sim->encrypt(data, result);
    std::cout << "result:" << result << std::endl;

    EncryptDecorator *res = new ReverseEncrypt(sim);
    res->encrypt(data, result);
    std::cout << "result:" << result << std::endl;

    EncryptDecorator *mod = new ModEncrypt(res);
    mod->encrypt(data, result);
    std::cout << "result:" << result << std::endl;

    delete mod;
    delete res;
    delete sim;

    return 0;
}

到了這里,關(guān)于《設(shè)計(jì)模式的藝術(shù)》筆記 - 裝飾模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 策略模式

    ? ? ? ? 策略模式定義一系列算法類,將每一個(gè)算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化,也稱為政策模式。策略模式是一種對(duì)象行為模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?策略模式提供了對(duì)開閉原則的完美支持。用戶可以在不

    2024年01月25日
    瀏覽(23)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 命令模式

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

    2024年01月20日
    瀏覽(30)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 組合模式

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

    2024年01月19日
    瀏覽(16)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 原型模式

    ? ? ? ? 使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過克隆這些原型創(chuàng)建新的對(duì)象。原型模式是一種對(duì)象創(chuàng)建型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 優(yōu)點(diǎn): ? ? ? ? 1.?當(dāng)創(chuàng)建新的對(duì)象實(shí)例較為復(fù)雜時(shí),使用原型模式可以簡化對(duì)象的創(chuàng)建過程,通過復(fù)制一個(gè)已有實(shí)例可以提

    2024年01月19日
    瀏覽(23)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 簡單工廠模式

    《設(shè)計(jì)模式的藝術(shù)》筆記 - 簡單工廠模式

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

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

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

    2024年02月02日
    瀏覽(18)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 抽象工廠模式

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

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

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

    2024年01月16日
    瀏覽(24)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 迭代器模式

    ? ? ? ? 迭代器模式提供一種方法來訪問聚合對(duì)象,而不用暴露這個(gè)對(duì)象的內(nèi)部表示,其別名為游標(biāo)(Cursor)。迭代器模式是一種對(duì)象行為型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1. 支持以不同的方式遍歷一個(gè)聚合對(duì)象,在同一個(gè)聚合對(duì)象上可以定義多種遍歷方式。在迭代

    2024年01月24日
    瀏覽(22)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 享元模式

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

    2024年01月19日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包