0
点赞
收藏
分享

微信扫一扫

Python中使用HTTPX:构建高效异步HTTP客户端

梯梯笔记 2024-08-22 阅读 27

一、外观模式简介

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口来访问子系统中的一组接口,使得子系统的使用更加简单和方便。通过外观模式,可以将复杂的子系统封装在一个外观类(Facade)中,从而减少代码的耦合度,提高系统的可维护性和易用性。

外观模式的结构图

外观模式的核心概念

二、外观模式的应用场景

三、外观模式的设计方法

假设我们有一个复杂的家庭影院系统,包括电视、音响和DVD播放器、APP、CCTV。我们希望通过一个简单的接口来控制这个系统,而不必直接操作每个子系统。

facade.cpp

#include <iostream>
#include <string>

// 子系统
class TV {
public:
    void turnOn() { std::cout << "TV is now ON\n"; }
    void turnOff() { std::cout << "TV is now OFF\n"; }
};

class SoundSystem {
public:
    void turnOn() { std::cout << "Dolby Atmos Sound System is now ON\n"; }
    void turnOff() { std::cout << "Sound System is now OFF\n"; }
};

class DVDPlayer {
public:
    void turnOn() { std::cout << "DVD Player is now ON\n"; }
    void turnOff() { std::cout << "DVD Player is now OFF\n"; }
};

class TencentAPP {
public:
    void turnOn() { std::cout << "Tencent APP is now ON\n"; }
    void turnOff() { std::cout << "Tencent APP is now OFF\n"; }
};

class CCTV {
public:
    void turnOn() { std::cout << "CCTV is now ON\n"; }
    void turnOff() { std::cout << "CCTV is now OFF\n"; }
};

// 家庭影音
class HomeTheaterFacade {
public:
    HomeTheaterFacade(TV* tv, SoundSystem* soundSystem, TencentAPP* tencentAPP, CCTV* cctv)
        : tv_(tv), soundSystem_(soundSystem), tencentAPP_(tencentAPP), cctv_(cctv) {}

    void watchMovie() {
        std::cout << "Get ready to watch a movie...\n";
        tv_->turnOn();
        soundSystem_->turnOn();
        tencentAPP_->turnOn();
        cctv_->turnOn();
    }

    void endMovie() {
        std::cout << "Shutting down movie setup...\n";
        cctv_->turnOff();
        tencentAPP_->turnOff();
        soundSystem_->turnOff();
        tv_->turnOff();
    }

private:
    TV* tv_;
    SoundSystem* soundSystem_;
    TencentAPP* tencentAPP_;
    CCTV* cctv_;
};

// 电影院
class CinemaFacade {
public:
    CinemaFacade(TV* tv, SoundSystem* soundSystem, DVDPlayer* dvdPlayer)
        : tv_(tv), soundSystem_(soundSystem), dvdPlayer_(dvdPlayer) {}

    void watchMovie() {
        std::cout << "Get ready to watch a movie...\n";
        tv_->turnOn();
        soundSystem_->turnOn();
        dvdPlayer_->turnOn();
    }

    void endMovie() {
        std::cout << "Shutting down movie setup...\n";
        dvdPlayer_->turnOff();
        soundSystem_->turnOff();
        tv_->turnOff();
    }

private:
    TV* tv_;
    SoundSystem* soundSystem_;
    DVDPlayer* dvdPlayer_;
};

// 使用外观类
void doWorking(const int type) {
    if(type == 1) {
        TV tv;
        SoundSystem soundSystem;
        TencentAPP tencentAPP;
        CCTV cctv;

        HomeTheaterFacade homeTheater(&tv, &soundSystem, &tencentAPP, &cctv);
        homeTheater.watchMovie();  // 开始看电影
        homeTheater.endMovie();    // 结束电影
    }
    else if(type == 2) {
        TV tv;
        SoundSystem soundSystem;
        DVDPlayer dvdPlayer;

        CinemaFacade cinema(&tv, &soundSystem, &dvdPlayer);
        cinema.watchMovie();  // 开始看电影
        cinema.endMovie();    // 结束电影
    }
}

int main() {
    int type;
    std::cout << "Please select the Viewing mode: 家庭影音(1) or 电影院(2): ";
    std::cin >> type;
    doWorking(type);
    return 0;
}

运行效果

四、总结

外观模式的应用可以使看起来复杂的外观简化,使得系统看起来更加直观和方便。

举报

相关推荐

0 条评论