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

《設(shè)計(jì)模式的藝術(shù)》筆記 - 適配器模式

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

介紹

? ? ? ? 適配器模式將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,使接口不兼容的那些類(lèi)可以一起工作,其別名為包裝器。

實(shí)現(xiàn)

對(duì)象適配器模式

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Target {  // 目標(biāo)類(lèi)
public:
    virtual void request() = 0;
};

class Adaptee {     // 適配者類(lèi)
public:
    void specificRequest();
};

class Adapter : public Target { // 適配器類(lèi)
public:
    Adapter(Adaptee *adaptee);
    void request() override;

private:
    Adaptee *m_adaptee;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

Adapter::Adapter(Adaptee *adaptee) {
    m_adaptee = adaptee;
}

void Adapter::request() {
    if (m_adaptee) {
        m_adaptee->specificRequest();
    }
}

void Adaptee::specificRequest() {
    std::cout << "Adaptee被適配" << std::endl;
}

main.cpp

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

int main() {
    Adaptee *adaptee = new Adaptee;
    Target *target = new Adapter(adaptee);
    target->request();
    delete target;
    delete adaptee;

    return 0;
}

類(lèi)適配器模式

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Target {  // 目標(biāo)類(lèi)
public:
    virtual void request() = 0;
};

class Adaptee {     // 適配者類(lèi)
public:
    void specificRequest();
};

class Adapter : public Target, public Adaptee { // 適配器類(lèi)
public:
    void request() override;

};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"


void Adapter::request() {
    specificRequest();
}

void Adaptee::specificRequest() {
    std::cout << "Adaptee被適配" << std::endl;
}

main.cpp

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

int main() {
    Target *target = new Adapter();
    target->request();
    delete target;

    return 0;
}

雙向適配器

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Target {  // 目標(biāo)類(lèi)
public:
    void request();
};

class Adaptee {     // 適配者類(lèi)
public:
    void specificRequest();
};

class Adapter { // 適配器類(lèi)
public:
    Adapter(Target *target);
    Adapter(Adaptee *adaptee);
    void request();
    void specificRequest();

private:
    Target *m_target;
    Adaptee *m_adaptee;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

void Target::request() {
    std::cout << "Target被適配" << std::endl;
}

Adapter::Adapter(Target *target) {
    m_target = target;
}

Adapter::Adapter(Adaptee *adaptee) {
    m_adaptee = adaptee;
}

void Adapter::request() {
    if (m_adaptee) {
        m_adaptee->specificRequest();
    }
}

void Adapter::specificRequest() {
    if (m_target) {
        m_target->request();
    }
}

void Adaptee::specificRequest() {
    std::cout << "Adaptee被適配" << std::endl;
}

main.cpp

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

int main() {
    Target *target = new Target();
    Adaptee *adaptee = new Adaptee();
    Adapter *adapter = new Adapter(target);
    adapter->specificRequest();
    delete adapter;
    adapter = new Adapter(adaptee);
    adapter->request();
    delete adapter;
    delete adaptee;
    delete target;

    return 0;
}

缺省適配器模式

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class ServiceInterface {    // 適配者接口
public:
    virtual void request() = 0;
    virtual void request2() = 0;
    virtual void request3() = 0;
};

class AbstractService : public ServiceInterface {     // 缺省適配器類(lèi)
public:
    virtual void request() override;

    virtual void request2() override;

    virtual void request3() override;
};

class Adaptee {     // 適配者類(lèi)
public:
    void specificRequest();
};

class Adapter : public AbstractService { // 具體適配器類(lèi)
public:
    Adapter(Adaptee *adaptee);
    void request() override;

private:
    Adaptee *m_adaptee;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

Adapter::Adapter(Adaptee *adaptee) {
    m_adaptee = adaptee;
}

void Adapter::request() {
    if (m_adaptee) {
        m_adaptee->specificRequest();
    }
}

void Adaptee::specificRequest() {
    std::cout << "Adaptee被適配" << std::endl;
}

void AbstractService::request() {
    std::cout << "缺省函數(shù)request" << std::endl;
}

void AbstractService::request2() {
    std::cout << "缺省函數(shù)request2" << std::endl;
}

void AbstractService::request3() {
    std::cout << "缺省函數(shù)request3" << std::endl;
}

main.cpp

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

int main() {
    Adaptee *adaptee = new Adaptee();
    Adapter *adapter = new Adapter(adaptee);
    adapter->request();
    adapter->request2();
    adapter->request3();
    delete adapter;
    delete adaptee;

    return 0;
}

總結(jié)

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

? ? ? ? 1.?將目標(biāo)類(lèi)和適配者類(lèi)解耦。通過(guò)引入一個(gè)適配器類(lèi)來(lái)重用現(xiàn)有的適配者類(lèi),無(wú)須修改原有結(jié)構(gòu)。

? ? ? ? 2.?增加了類(lèi)的透明性和復(fù)用性。將具體的業(yè)務(wù)實(shí)現(xiàn)過(guò)程封裝在適配者類(lèi)中,對(duì)于客戶端類(lèi)而言是透明的,而且提高了適配者類(lèi)的復(fù)用性,同一個(gè)適配者類(lèi)可以在多個(gè)不同的系統(tǒng)中復(fù)用。

? ? ? ? 3.?靈活性和擴(kuò)展性都非常好。通過(guò)使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類(lèi),完全符合開(kāi)閉原則。

缺點(diǎn)

? ? ? ? 1.?對(duì)于Java、C#等不支持多重類(lèi)繼承的語(yǔ)言,一次最多只能適配一個(gè)適配者類(lèi),不能同時(shí)適配多個(gè)適配者。

? ? ? ? 2.?適配者類(lèi)不能為最終類(lèi),例如在Java中不能為final類(lèi),C#中不能為sealed類(lèi)。

? ? ? ? 3.?在Java、C#等語(yǔ)言中,類(lèi)適配器模式中的目標(biāo)抽象類(lèi)只能為接口,不能為類(lèi),其使用有一定的局限性。

適用場(chǎng)景

? ? ? ? 1.?系統(tǒng)需要使用一些現(xiàn)有的類(lèi),而這些類(lèi)的接口(例如方法名)不符合系統(tǒng)的需要,甚至沒(méi)有這些類(lèi)的源代碼。

? ? ? ? 2.?想創(chuàng)建一個(gè)可以重復(fù)使用的類(lèi),用于與一些彼此之間沒(méi)有太大關(guān)聯(lián)的類(lèi),包括一些可能在將來(lái)引進(jìn)的類(lèi)一起工作。

練習(xí)

對(duì)象適配器模式

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Encryption {  // 目標(biāo)類(lèi)
public:
    virtual std::string encrypt(std::string data) = 0;
};

class ThirdLib {     // 適配者類(lèi)
public:
    std::string specificEncrypt(std::string data);
    std::string specificDecrypt(std::string data);
};

class AdapterEncyption : public Encryption {    // 適配器類(lèi)
public:
    AdapterEncyption(ThirdLib *thirdLib);
    ~AdapterEncyption();
    std::string encrypt(std::string data) override;

private:
    ThirdLib *m_thirdLib;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

AdapterEncyption::AdapterEncyption(ThirdLib *thirdLib) {
    m_thirdLib = thirdLib;
}

AdapterEncyption::~AdapterEncyption() {
    if (m_thirdLib) {
        delete m_thirdLib;
    }
}

std::string AdapterEncyption::encrypt(std::string data) {
    if (m_thirdLib) {
        return m_thirdLib->specificEncrypt(data);
    }
    return data;
}

std::string ThirdLib::specificEncrypt(std::string data) {
    return "加密后的" + data;
}

std::string ThirdLib::specificDecrypt(std::string data) {
    return "解密后的" + data;
}

main.cpp

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

int main() {
    ThirdLib *thirdLib = new ThirdLib();
    Encryption *encryption = new AdapterEncyption(thirdLib);
    std::string data = encryption->encrypt("口令");
    std::cout << data << std::endl;
    data = encryption->encrypt("郵箱");
    std::cout << data << std::endl;

    return 0;
}

類(lèi)適配器模式

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Encryption {  // 目標(biāo)類(lèi)
public:
    virtual std::string encrypt(std::string data) = 0;
};

class ThirdLib {     // 適配者類(lèi)
public:
    std::string specificEncrypt(std::string data);
    std::string specificDecrypt(std::string data);
};

class AdapterEncyption : public Encryption, public ThirdLib {    // 適配器類(lèi)
public:
    AdapterEncyption();
    ~AdapterEncyption();
    std::string encrypt(std::string data) override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

AdapterEncyption::AdapterEncyption() {

}

AdapterEncyption::~AdapterEncyption() {

}

std::string AdapterEncyption::encrypt(std::string data) {
    return specificEncrypt(data);
}

std::string ThirdLib::specificEncrypt(std::string data) {
    return "加密后的" + data;
}

std::string ThirdLib::specificDecrypt(std::string data) {
    return "解密后的" + data;
}

main.cpp文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-801836.html

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

int main() {
    Encryption *encryption = new AdapterEncyption();
    std::string data = encryption->encrypt("口令");
    std::cout << data << std::endl;
    data = encryption->encrypt("郵箱");
    std::cout << data << std::endl;
    delete encryption;

    return 0;
}

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

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(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è)計(jì)模式-適配器模式

    在我們生活中,插座輸出的電源都是220V的,而我們手機(jī)充電需要的電壓基本都是5V的。我們不能直接用220V的電壓來(lái)給手機(jī)充電,也不能說(shuō)專(zhuān)門(mén)有線路來(lái)提供5V的電壓。所以就有了充電器,充電器可以將220V的電壓轉(zhuǎn)為5V的電壓,這樣我們就方便太多了。 上面所說(shuō)的充電器其實(shí)就

    2024年02月08日
    瀏覽(34)
  • 【設(shè)計(jì)模式】適配器模式

    【設(shè)計(jì)模式】適配器模式

    適配器模式(Adapter Pattern)是作為兩個(gè)不兼容的接口之間的橋梁。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個(gè)獨(dú)立接口的功能。 這種模式涉及到一個(gè)單一的類(lèi),該類(lèi)負(fù)責(zé)加入獨(dú)立的或不兼容的接口功能。舉個(gè)真實(shí)的例子,讀卡器是作為內(nèi)存卡和筆記本之間的適配器。

    2024年02月12日
    瀏覽(32)
  • 設(shè)計(jì)模式四:適配器模式

    設(shè)計(jì)模式四:適配器模式

    1、適配器模式的理解 適配器模式可以理解為有兩個(gè)現(xiàn)成的類(lèi)Adaptee和Target,它們兩個(gè)是不能動(dòng)的,要求必須使用B這個(gè)類(lèi)來(lái)實(shí)現(xiàn)一個(gè)功能,但是A的內(nèi)容是能復(fù)用的,這個(gè)時(shí)候我們需要編寫(xiě)一個(gè)轉(zhuǎn)換器 適配器模式 Adaptee:被適配者,現(xiàn)有的接口或者類(lèi); Adapter:適配器類(lèi),適配器

    2024年02月22日
    瀏覽(24)
  • 設(shè)計(jì)模式 06 適配器模式

    適配器模式(Adapter Pattern)屬于 結(jié)構(gòu)型 模式 結(jié)構(gòu)型 模式關(guān)注如何將現(xiàn)有的類(lèi)或?qū)ο蠼M織在一起形成更加強(qiáng)大的結(jié)構(gòu)。 在生活中,我們經(jīng)常遇到這樣的一個(gè)問(wèn)題:輕薄筆記本通常只有 type-c 或者 usb-a 接口,沒(méi)有網(wǎng)口。但日常使用中是往往需要連接網(wǎng)口上網(wǎng)的,這時(shí)想到的第

    2024年02月11日
    瀏覽(19)
  • 設(shè)計(jì)模式-- 3.適配器模式

    設(shè)計(jì)模式-- 3.適配器模式

    將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。 請(qǐng)求者(client):客戶端角色,需要使用適配器的對(duì)象,不需要關(guān)心適配器內(nèi)部的實(shí)現(xiàn),只對(duì)接目標(biāo)角色。 目標(biāo)角色(Target):目標(biāo)角色,和client直接對(duì)接,定義

    2024年01月18日
    瀏覽(26)
  • 《設(shè)計(jì)模式》之適配器模式

    《設(shè)計(jì)模式》之適配器模式

    把一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶端所期待的另一種接口,從而使原接口不匹配而無(wú)法再一起工作的兩個(gè)類(lèi)能在一起工作。 在軟件系統(tǒng)中,由于應(yīng)用環(huán)境的變化,常常需要將“一些現(xiàn)存的對(duì)象”放在新的環(huán)境中應(yīng)用,但是新環(huán)境要求的接口是這些現(xiàn)存對(duì)象所不能滿足的。 如何應(yīng)對(duì)

    2024年02月09日
    瀏覽(22)
  • 適配器設(shè)計(jì)模式

    適配器設(shè)計(jì)模式

    一、適配器模式 B站:java架構(gòu)師 定義:適配器模式把一個(gè)類(lèi)的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類(lèi)能夠在一起工作 三種適配器:類(lèi)的適配器模式、對(duì)象的適配器模式、接口的適配器模式 1.類(lèi)適配器模式 實(shí)現(xiàn)方式:讓

    2024年02月11日
    瀏覽(22)
  • 設(shè)計(jì)模式——適配器

    說(shuō)起適配器,大家第一個(gè)想到的可能就是電源適配器。 電源適配器的作用想必同學(xué)們也都清楚,那就是將220伏高電壓轉(zhuǎn)換成想要的5伏至20伏左右穩(wěn)定的低電壓。 從某種程度上講,編程中經(jīng)常提起的適配器模式的原理與上面講到的基本是一致的。 用于將一個(gè)類(lèi)的接口轉(zhuǎn)換成另

    2024年02月12日
    瀏覽(22)
  • 【設(shè)計(jì)模式】使用適配器模式做補(bǔ)償設(shè)計(jì)

    【設(shè)計(jì)模式】使用適配器模式做補(bǔ)償設(shè)計(jì)

    適配器模式是一種 結(jié)構(gòu)型設(shè)計(jì)模式 ,它提供了一個(gè)中間層,通過(guò)這個(gè)中間層,客戶端可以使用統(tǒng)一的接口與具有不同接口的類(lèi)進(jìn)行交互,也就是說(shuō),將一個(gè)接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,使得原本不兼容的接口能夠協(xié)同工作。 舉個(gè)現(xiàn)實(shí)中的例子,我們現(xiàn)在的很多輕薄筆

    2024年02月22日
    瀏覽(24)
  • 【設(shè)計(jì)模式】適配器模式怎么理解?

    【設(shè)計(jì)模式】適配器模式怎么理解?

    什么是轉(zhuǎn)換器模式? 轉(zhuǎn)換器模式是一種結(jié)構(gòu)型設(shè)計(jì)模式, 主要用于在兩種不同類(lèi)型的對(duì)象之間進(jìn)行轉(zhuǎn)換,而不需要改變?cè)偷膶?shí)際邏輯。這是一種在軟件設(shè)計(jì)中經(jīng)常使用的模式 ,它有助于保持代碼的整潔和組織。在軟件開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到在不同層之間轉(zhuǎn)換對(duì)象的需求

    2024年01月25日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包