C++ 设计模式——外观模式

news2024/9/19 10:37:32

外观模式

    • C++ 设计模式——外观模式
      • 主要组成部分
        • 1. 外观类(Facade)
        • 2. 子系统类(Subsystem)
        • 3. 客户端(Client)
      • 例一:工作流程示例
        • 1. 外观类(Facade)
        • 2. 子系统类(Subsystem)
        • 3. 客户端(Client)
        • UML 图
        • UML 图解析
          • 1. 外观类与子系统类的依赖
          • 2. 子系统类之间的独立性
          • 3. 客户端与外观类的依赖
      • 例二:工作流程示例
        • 1. 设备类
        • 2. 外观类(HomeTheaterFacade)
        • 3. 客户端(main 函数)
      • UML 图
      • UML 图解析
        • 1. 外观类与子系统类的依赖
        • 2. 子系统类之间的独立性
        • 3. 客户端与外观类的关系
      • 优缺点
      • 适用场景
      • 例一:完整代码
      • 例二:完整代码

C++ 设计模式——外观模式

外观模式(Facade Pattern)是一种结构性设计模式,它为复杂的子系统提供一个简单的接口。通过外观模式,客户端通过外观类与子系统进行交互,外观类将客户端的请求委托给适当的子系统对象,从而实现功能的调用。这样的设计隐藏了子系统的复杂性,使得客户端与子系统之间的耦合度降低。

引入“外观”设计模式的定义(实现意图):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

主要组成部分

1. 外观类(Facade)
  • 核心角色:外观类是外观模式的核心,提供一个统一的接口,简化客户端与子系统之间的交互。
  • 封装子系统:它封装了多个子系统类,对外提供高层次的接口,使得客户端无需直接与子系统交互。
  • 协调功能:外观类负责协调子系统对象的调用顺序,确保它们能够协同工作。
2. 子系统类(Subsystem)
  • 具体实现:子系统类实现系统的具体功能,通常由多个子系统类组成。
  • 独立性:每个子系统类独立于外观类,它们不需要了解外观类的存在。
  • 相互通信:子系统类之间可以相互通信,也可以被外观类调用。
3. 客户端(Client)
  • 简化交互:客户端使用外观类提供的接口与系统交互。
  • 隐藏细节:客户端不需要了解子系统的具体实现细节,只需与外观类进行交互。

例一:工作流程示例

以《魔兽世界》这款流行的网络游戏为例,其配置选项丰富多样,包括图形、声音和语音聊天等多个方面。每个方面都有详细的配置项。

1. 外观类(Facade)

conffacade 类是外观类,它提供了 LowConfComputerHighConfComputer 两个方法,分别用于配置低配置和高配置的电脑。它内部调用了多个子系统的实例,简化了客户端的调用。

//扮演外观模式角色的类
class conffacade
{
    //--------------单件类实现相关begin----------------
private:
    conffacade() {};
    conffacade(const conffacade& tmpobj);
    conffacade& operator = (const conffacade& tmpobj);
    ~conffacade() {};
public:
    static conffacade& getInstance()
    {
        static conffacade instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void LowConfComputer() //对于低配置电脑,只开启一些低配置选项
    {
        graphic& g_gp = graphic::getInstance();
        g_gp.display(true); //全屏耗费资源更低
        g_gp.effect(false);
        g_gp.resolution(2);
        g_gp.antialiasing(false);
        
        sound& g_snd = sound::getInstance();
        g_snd.bgsound(false);
        g_snd.envirsound(false);
        g_snd.expsound(false);
        g_snd.setvolume(15);
        
        chatvoice& g_cv = chatvoice::getInstance();
        g_cv.micvolume(20);
        g_cv.micsens(50);
        g_cv.chatvolume(60);
    }
    
    void HighConfComputer() //对于高配置电脑,能达到最好效果的项全部开启
    {
        graphic& g_gp = graphic::getInstance();
        g_gp.display(false);
        g_gp.effect(true);
        g_gp.resolution(0);
        g_gp.antialiasing(true);
        
        sound& g_snd = sound::getInstance();
        g_snd.bgsound(true);
        g_snd.envirsound(true);
        g_snd.expsound(true);
        g_snd.setvolume(50);
        
        chatvoice& g_cv = chatvoice::getInstance();
        g_cv.micvolume(100);
        g_cv.micsens(100);
        g_cv.chatvolume(100);
    }
};
2. 子系统类(Subsystem)

每个子系统类(graphicsoundchatvoice)负责自己的特定功能。它们提供了具体的方法供外观类调用,执行实际的业务逻辑。

//图形相关类
class graphic
{
    //--------------单件类实现相关begin----------------
private:
    graphic() {};
    graphic(const graphic& tmpobj);
    graphic& operator = (const graphic& tmpobj);
    ~graphic() {};
public:
    static graphic& getInstance()
    {
        static graphic instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void display(bool enable) //是否全屏显示(true:是)
    {
        cout << "图形->是否全屏显示->" << enable << endl;
        //其他代码略......
    }
    void effect(bool enable)//是否开启特效(true:是)
    {
        cout << "图形->是否开启特效->" << enable << endl;
    }
    void resolution(int index) //设置窗口分辨率
    {
        cout << "图形->分辨率设置选项->" << index << endl;
    }
    void antialiasing(bool enable)//是否开启抗锯齿(true:是)
    {
        cout << "图形->是否开启抗锯齿->" << enable << endl;
    }
    //其他接口略......
};

//声音相关类
class sound
{
    //--------------单件类实现相关begin----------------
private:
    sound() {};
    sound(const sound& tmpobj);
    sound& operator = (const sound& tmpobj);
    ~sound() {};
public:
    static sound& getInstance()
    {
        static sound instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void bgsound(bool enable) //是否开启背景声音(true:是)
    {
        cout << "声音->是否开启背景声音->" << enable << endl;
    }
    void envirsound(bool enable)//是否开启环境音效(true:是)
    {
        cout << "声音->是否开启环境音效->" << enable << endl;
    }
    void expsound(bool enable) //是否开启表情声音(true:是)
    {
        cout << "声音->是否开启表情声音->" << enable << endl;
    }
    void setvolume(int level) //音量大小设置(0-100)
    {
        cout << "声音->音量大小为->" << level << endl;
    }
    //其他接口略......
};

//语音聊天相关类
class chatvoice
{
    //--------------单件类实现相关begin----------------
private:
    chatvoice() {};
    chatvoice(const chatvoice& tmpobj);
    chatvoice& operator = (const chatvoice& tmpobj);
    ~chatvoice() {};
public:
    static chatvoice& getInstance()
    {
        static chatvoice instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void micvolume(int level) //麦克风音量大小设置(0-100)
    {
        cout << "语音聊天->麦克风音量大小为->" << level << endl;
    }
    void micsens(int level)//麦克灵敏度设置(0-100)
    {
        cout << "语音聊天->麦克风灵敏度为->" << level << endl;
    }
    void chatvolume(int level) //聊天音量设置(0-100)
    {
        cout << "语音聊天->聊天音量为->" << level << endl;
    }
    //其他接口略......
};
3. 客户端(Client)

main 函数中,客户端通过调用外观类的 LowConfComputerHighConfComputer 方法来配置电脑,而不需要了解各个子系统的内部实现。这种方式显著降低了复杂性。

int main() 
{
    conffacade& g_cffde = conffacade::getInstance();
    cout << "低配置电脑,调用LowConfComputer接口" << endl;
    g_cffde.LowConfComputer();
    cout << "------------------" << endl;
    cout << "高配置电脑,调用HighConfComputer接口" << endl;
    g_cffde.HighConfComputer();
    
    return 0;
}
UML 图

外观模式 UML 图1

UML 图解析
1. 外观类与子系统类的依赖
  • 外观类(conffacade)依赖于子系统类
    • conffacade 类内部需要调用 graphicsoundchatvoice 这三个子系统类的方法,以实现不同配置电脑的功能。
    • 例如,在 LowConfComputerHighConfComputer 方法中,外观类通过调用 graphic::getInstance()sound::getInstance()chatvoice::getInstance() 来获取各个子系统的实例,然后调用它们的方法。
2. 子系统类之间的独立性
  • 子系统类之间的独立性
    • 每个子系统类(如 graphicsoundchatvoice)是独立的,客户端和外观类并不直接依赖于它们的具体实现。
    • 这使得在未来需要修改或扩展某个子系统时,不会影响到客户端或外观类的其他部分。
3. 客户端与外观类的依赖
  • 客户端(main 函数)只依赖于外观类
    • 客户端通过外观类 conffacade 的实例来调用 LowConfComputerHighConfComputer 方法,而不需要直接与 graphicsoundchatvoice 等子系统类交互。
    • 这种设计减少了客户端与子系统之间的耦合,使得系统更易于维护和扩展。

例二:工作流程示例

在家庭影院系统中,多个设备(如屏幕、灯光、音箱、DVD播放器和游戏机)需要协同工作以提供良好的观影和游戏体验。使用外观模式,创建一个 HomeTheaterFacade 类。

1. 设备类

每个设备类都有 OnOff 方法,用于打开和关闭设备。简化这些设备的操作

//屏幕
class Screen
{
public:
    void On()
    {
        cout << "屏幕打开了!" << endl;
    }
    void Off()
    {
        cout << "屏幕关闭了!" << endl;
    }
};

//灯光
class Light
{
public:
    void On()
    {
        cout << "灯光打开了!" << endl;
    }
    void Off()
    {
        cout << "灯光关闭了!" << endl;
    }
};

//音箱
class Speaker
{
public:
    void On()
    {
        cout << "音箱打开了!" << endl;
    }
    void Off()
    {
        cout << "音箱关闭了!" << endl;
    }
};

//DVD播放器
class DvdPlayer
{
public:
    void On()
    {
        cout << "DVD播放器打开了!" << endl;
    }
    void Off()
    {
        cout << "DVD播放器关闭了!" << endl;
    }
};

//游戏机
class PlayerStation
{
public:
    void On()
    {
        cout << "游戏机打开了!" << endl;
    }
    void Off()
    {
        cout << "游戏机关闭了!" << endl;
    }
};
2. 外观类(HomeTheaterFacade)

HomeTheaterFacade 类提供了两个主要方法:WatchMoviePlayGame。这两个方法分别用于观看电影和玩游戏,内部调用相关设备的开关方法。

//家庭影院外观模式类
class HomeTheaterFacade
{
public:
    void WatchMovie() //看电影
    {
        //屏幕打开,灯光熄灭,音箱打开,DVD播放器打开,游戏机关闭。
        scnobj.On();
        lgobj.Off();
        spkobj.On();
        dpobj.On();
        psobj.Off();
    }
    void PlayGame() //玩游戏
    {
        //屏幕打开,灯光打开,音箱打开,DVD播放器关闭,游戏机打开。
        scnobj.On();
        lgobj.On();
        spkobj.On();
        dpobj.Off();
        psobj.On();
    }
private:
    Screen scnobj;
    Light lgobj;
    Speaker spkobj;
    DvdPlayer dpobj;
    PlayerStation psobj;
};
3. 客户端(main 函数)

main 函数中,客户端通过 HomeTheaterFacade 实例来调用 WatchMoviePlayGame 方法,简化了多个设备的操作。

int main()
{
    HomeTheaterFacade htfacobj;
    cout << "开始看电影---------------" << endl;
    htfacobj.WatchMovie();
    cout << "开始玩游戏---------------" << endl;
    htfacobj.PlayGame();
    
    return 0;
}

UML 图

外观模式 UML 图2

UML 图解析

1. 外观类与子系统类的依赖
  • HomeTheaterFacade 类:
    • 该类依赖于多个子系统类(ScreenLightSpeakerDvdPlayerPlayerStation)。它通过这些子系统类的实例来控制家庭影院的各个设备。
    • WatchMoviePlayGame 方法中,HomeTheaterFacade 调用这些子系统的 OnOff 方法来实现设备的开关操作。
2. 子系统类之间的独立性
  • 子系统类(ScreenLightSpeakerDvdPlayerPlayerStation):
    • 每个子系统类独立实现自己的功能,不依赖于其他子系统类。这种设计确保了每个设备的封装性和独立性,使得在未来的扩展中可以单独修改某个设备的实现,而不影响其他设备或外观类。
3. 客户端与外观类的关系
  • 客户端(main 函数):
    • 客户端通过 HomeTheaterFacade 的实例 htfacobj 调用 WatchMoviePlayGame 方法。客户端只依赖于外观类,而不需要直接与子系统类交互。
    • 这种依赖关系使得客户端的代码更为简洁,隐藏了系统的复杂性。

优缺点

优点

  • 简化接口:外观模式提供了一个统一的接口,使得子系统更加容易使用。
  • 降低耦合度:客户端与子系统之间的直接依赖关系减少,客户端只需与外观类交互。
  • 提高灵活性:当子系统发生变更时,只需要调整外观类的实现,而不需要修改客户端代码。
  • 易于维护:由于客户端与子系统解耦,系统的维护和扩展变得更加容易。

缺点

  • 违反开闭原则:如果增加新的子系统或者修改现有子系统的行为,可能需要修改外观类,这违反了开闭原则。
  • 可能导致设计过重:如果不恰当地使用外观模式,可能会导致系统出现大量细粒度的外观类,增加系统的复杂性。
  • 性能问题:在某些情况下,如果外观类需要处理多个子系统的交互,可能会引入额外的性能开销。

适用场景

  • 子系统复杂:当子系统非常复杂,客户端直接与子系统交互会非常困难时,可以使用外观模式。
  • 简化客户端调用:当需要提供一个简单的接口来隐藏系统的复杂性,让客户端不需要了解系统的内部细节时。
  • 构建层次结构:在构建多层结构的系统时,可以使用外观模式定义每一层的入口点,从而简化层与层之间的调用。
  • 解耦系统:当需要减少客户端与多个子系统之间的依赖关系,以降低系统耦合度时。
  • 逐步引入变化:当需要逐步引入新的子系统到现有系统中,而又不想影响现有客户端代码时,可以使用外观模式作为中间层逐步引入变化。

例一:完整代码

#include <iostream>
using namespace std;

//图形相关类
class graphic
{
    //--------------单件类实现相关begin----------------
private:
    graphic() {};
    graphic(const graphic& tmpobj);
    graphic& operator = (const graphic& tmpobj);
    ~graphic() {};
public:
    static graphic& getInstance()
    {
        static graphic instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void display(bool enable) //是否全屏显示(true:是)
    {
        cout << "图形->是否全屏显示->" << enable << endl;
        //其他代码略......
    }
    void effect(bool enable)//是否开启特效(true:是)
    {
        cout << "图形->是否开启特效->" << enable << endl;
    }
    void resolution(int index) //设置窗口分辨率
    {
        cout << "图形->分辨率设置选项->" << index << endl;
    }
    void antialiasing(bool enable)//是否开启抗锯齿(true:是)
    {
        cout << "图形->是否开启抗锯齿->" << enable << endl;
    }
    //其他接口略......
};

//声音相关类
class sound
{
    //--------------单件类实现相关begin----------------
private:
    sound() {};
    sound(const sound& tmpobj);
    sound& operator = (const sound& tmpobj);
    ~sound() {};
public:
    static sound& getInstance()
    {
        static sound instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void bgsound(bool enable) //是否开启背景声音(true:是)
    {
        cout << "声音->是否开启背景声音->" << enable << endl;
    }
    void envirsound(bool enable)//是否开启环境音效(true:是)
    {
        cout << "声音->是否开启环境音效->" << enable << endl;
    }
    void expsound(bool enable) //是否开启表情声音(true:是)
    {
        cout << "声音->是否开启表情声音->" << enable << endl;
    }
    void setvolume(int level) //音量大小设置(0-100)
    {
        cout << "声音->音量大小为->" << level << endl;
    }
    //其他接口略......
};

//语音聊天相关类
class chatvoice
{
    //--------------单件类实现相关begin----------------
private:
    chatvoice() {};
    chatvoice(const chatvoice& tmpobj);
    chatvoice& operator = (const chatvoice& tmpobj);
    ~chatvoice() {};
public:
    static chatvoice& getInstance()
    {
        static chatvoice instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void micvolume(int level) //麦克风音量大小设置(0-100)
    {
        cout << "语音聊天->麦克风音量大小为->" << level << endl;
    }
    void micsens(int level)//麦克灵敏度设置(0-100)
    {
        cout << "语音聊天->麦克风灵敏度为->" << level << endl;
    }
    void chatvolume(int level) //聊天音量设置(0-100)
    {
        cout << "语音聊天->聊天音量为->" << level << endl;
    }
    //其他接口略......
};

//---------------------------------------------------
//扮演外观模式角色的类
class conffacade
{
    //--------------单件类实现相关begin----------------
private:
    conffacade() {};
    conffacade(const conffacade& tmpobj);
    conffacade& operator = (const conffacade& tmpobj);
    ~conffacade() {};
public:
    static conffacade& getInstance()
    {
        static conffacade instance;
        return instance;
    }
    //--------------单件类实现相关end----------------
public:
    void LowConfComputer() //对于低配置电脑,只开启一些低配置选项
    {
        graphic& g_gp = graphic::getInstance();
        g_gp.display(true); //全屏耗费资源更低
        g_gp.effect(false);
        g_gp.resolution(2);
        g_gp.antialiasing(false);

        sound& g_snd = sound::getInstance();
        g_snd.bgsound(false);
        g_snd.envirsound(false);
        g_snd.expsound(false);
        g_snd.setvolume(15);

        chatvoice& g_cv = chatvoice::getInstance();
        g_cv.micvolume(20);
        g_cv.micsens(50);
        g_cv.chatvolume(60);
    }

    void HighConfComputer() //对于高配置电脑,能达到最好效果的项全部开启
    {
        graphic& g_gp = graphic::getInstance();
        g_gp.display(false);
        g_gp.effect(true);
        g_gp.resolution(0);
        g_gp.antialiasing(true);

        sound& g_snd = sound::getInstance();
        g_snd.bgsound(true);
        g_snd.envirsound(true);
        g_snd.expsound(true);
        g_snd.setvolume(50);

        chatvoice& g_cv = chatvoice::getInstance();
        g_cv.micvolume(100);
        g_cv.micsens(100);
        g_cv.chatvolume(100);
    }
};

int main()
{    
    conffacade& g_cffde = conffacade::getInstance();
    cout << "低配置电脑,调用LowConfComputer接口" << endl;
    g_cffde.LowConfComputer();
    cout << "------------------" << endl;
    cout << "高配置电脑,调用HighConfComputer接口" << endl;
    g_cffde.HighConfComputer();           
    
    return 0;
}

例二:完整代码

//屏幕
class Screen
{
public:
    void On()
    {
        cout << "屏幕打开了!" << endl;
    }
    void Off()
    {
        cout << "屏幕关闭了!" << endl;
    }
};

//灯光
class Light
{
public:
    void On()
    {
        cout << "灯光打开了!" << endl;
    }
    void Off()
    {
        cout << "灯光关闭了!" << endl;
    }
};

//音箱
class Speaker
{
public:
    void On()
    {
        cout << "音箱打开了!" << endl;
    }
    void Off()
    {
        cout << "音箱关闭了!" << endl;
    }
};

//DVD播放器
class DvdPlayer
{
public:
    void On()
    {
        cout << "DVD播放器打开了!" << endl;
    }
    void Off()
    {
        cout << "DVD播放器关闭了!" << endl;
    }
};

//游戏机
class PlayerStation
{
public:
    void On()
    {
        cout << "游戏机打开了!" << endl;
    }
    void Off()
    {
        cout << "游戏机关闭了!" << endl;
    }
};

//家庭影院外观模式类
class HomeTheaterFacade
{
public:
    void WatchMovie() //看电影
    {
        //屏幕打开,灯光熄灭,音箱打开,DVD播放器打开,游戏机关闭。
        scnobj.On();
        lgobj.Off();
        spkobj.On();
        dpobj.On();
        psobj.Off();
    }
    void PlayGame() //玩游戏
    {
        //屏幕打开,灯光打开,音箱打开,DVD播放器关闭,游戏机打开。
        scnobj.On();
        lgobj.On();
        spkobj.On();
        dpobj.Off();
        psobj.On();
    }
private:
    Screen scnobj;
    Light lgobj;
    Speaker spkobj;
    DvdPlayer dpobj;
    PlayerStation psobj;
};

int main()
{
    HomeTheaterFacade htfacobj;
    cout << "开始看电影---------------" << endl;
    htfacobj.WatchMovie();
    cout << "开始玩游戏---------------" << endl;
    htfacobj.PlayGame();
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPU池化技术在油气勘探开发中的应用

01 背景介绍 国内某研究院为实现石油勘探开发专业软件资源的统一管理、统一监控、统一共享和统一计量&#xff0c;自主研发了勘探云管理平台(EPCP)和科研工作业务协同平台。该研究院通过两个平台实现了数十种专业勘探开发软件的共享&#xff0c;种类包括地震资料处理和解释&am…

中国四向穿梭车各角色、各玩家:大盘点

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 四向穿梭车作为现代物流自动化的关键设备&#xff0c;正在全球范围内迅速发展。 本文将对四向穿梭车的不同类别的厂商进行大盘点&#x…

pdfplumber - pdf 数据提取

文章目录 一、关于 pdfplumber安装 二、命令行界面1、基本示例2、选项 三、Python库1、基本示例2、加载PDF3、pdfplumber.PDF类4、pdfplumber.Page 类5、对象char特性line属性rect属性curve 属性派生属性image属性 6、通过pdfminer获取更高级别的pdfminer.six 四、可视化调试1、…

92.WEB渗透测试-信息收集-Google语法(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;91.WEB渗透测试-信息收集-Google语法&#xff08;5&#xff09; 监控的漏洞也有很多 打…

探索人工智能的未来:埃里克·施密特2024斯坦福大学分享四

一、语言模型的经济影响 关于语言模型的经济影响&#xff0c;我想先谈谈市场的影响。我们看到一些服务领域的变化速度比预期的要慢&#xff0c;比如 CHEG 和其他相关服务的表现。对此&#xff0c;您是否认为学术界应该获得人工智能补贴&#xff1f;还是说&#xff0c;他们应该…

树刷题codetop!!暴打面试题!!!!

题源codetop标签近半年树 1.二叉树的层序遍历2.二叉树的层序遍历II3.二叉树的锯齿形层次遍历4.N叉树的层次遍历5.二叉树的最近公共祖先6.二叉搜索树的最近公共祖先7.二叉树的直径8.二叉树中最大路径和9.二叉树的前序遍历10.从前序与中序遍历序列构造二叉树11.从中序与后序遍历序…

Tomcat:企业 WEB 奇境的开启密钥

目录 一.Tomcat 优势 二.前端三大核心技术 1.HTML 2.CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表 3.JavaScript 三.WEB框架 1.web资源和访问:PC 端或移动端浏览器访问 2.web资源和访问:手机 App 访问 四.单体架构 五.微服务 1.微服务的优点 2.微…

【第55课】XSS防御HttpOnlyCSP靶场工具等

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

Spring MVC图解

浏览器 (客户端请求) 用户通过浏览器发起HTTP请求&#xff0c;这个请求首先被Spring MVC的DispatcherServlet捕获。DispatcherServlet是前端控制器&#xff0c;用于协调整个请求处理过程。DispatcherServlet (前的端控制器) DispatcherServlet接收到请求后&#xff0c;首先会根…

推荐一款低成本 小尺寸数字脉冲编码调制(PCM)输入D类功率放大器 MAX98357AETE+T 兼具AB类性能

MAX98357AETET是数字脉冲编码调制(PCM)输入D类功率放大器&#xff0c;可提供AB类音频性能&#xff0c;同时具有D类的效率。器件在I2S/左对齐模式下通过单个增益设置输入可提供5中可选择增益(3dB、6dB、9dB、12dB、15dB)&#xff0c;在TDM模式下为固定12dB增益。 数字音频接口高…

【第57课】SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

IDEA配置leetcode插件

1.安装 2.配置 类名称 $!velocityTool.camelCaseName($!velocityTool.snakeCaseName(${question.title}))_$!{question.frontendQuestionId} 默认生成的内容 // 【${question.frontendQuestionId}】 // ${question.title}, $!velocityTool.snakeCaseName(${question.title}) $…

Autojs详解

目录 一&#xff0c;AutoJs概述 二&#xff0c;环境搭建 三&#xff0c;js语法 四&#xff0c;基于控件的操作 1&#xff0c;吐司 2&#xff0c;点击 3&#xff0c;长按 4&#xff0c;设置文本 5&#xff0c;UiSelector 6&#xff0c;UiObject 7&#xff0c;控件集合的操作方法…

服务器五大关键组件拆解分析

拆解服务器五大关键组件 "AI服务器五大硬件揭秘&#xff1a;深入剖析PCB构造&#xff0c;揭示内部真实面貌。本文通过一步步拆解PCB,为读者呈现了一台服务器的内部世界&#xff0c;力求让您对服务器升级的潜在价值有更深的理解和把握。" 1、五大硬件部分可归纳为——…

VS Code 远程连接SSH服务

随着技术的不断迭代更新&#xff0c;在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器&#xff08;我曾经也是个 vimer&#xff0c;但是 VS Code 实在太香了&#xff09;&#xff0c;已经很难适应当下的开发效率。因此大多数开发者开始使用 VS Code 远程连接 Linux 系…

提交试卷+智能生成评价

文章目录 1.提交试卷1.req和vo1.InterviewSubmitReq.java2.InterviewResultVO.java 2.InterviewController.java3.service1.InterviewHistoryService.java2.InterviewHistoryServiceImpl.java3.InterviewEngine.java4.JiChiInterviewEngine.java5.EvaluateUtils.java 4.测试 2.…

【前端基础篇】CSS基础速通万字介绍(下篇)

文章目录 前言背景属性背景颜色背景图片背景平铺背景位置背景尺寸 圆角矩形生成圆形生成圆角矩形 Chrome调试工具打开方式标签页含义elements标签页使用 元素显示模式块级元素行内元素/内联元素行内元素和块级元素的区别 盒模型边框内边距外边距 块级元素水平居中去除浏览器默认…

凤凰花:绚烂花语与独特魅力

一、凤凰花的花语内涵 凤凰花的花语丰富而深刻&#xff0c;蕴含着多种情感和意义。 思念&#xff0c;是凤凰花常见的花语之一。它那鲜艳的花朵绽放在枝头&#xff0c;远眺着远方&#xff0c;仿佛在传递着对朋友和亲人深深的牵挂与想念。这种思念&#xff0c;如同苦涩的咖啡&am…

Cesium 视频纹理

Cesium 视频纹理 话不多说&#xff0c;直接上代码 <video id"video_dom"><source src"./video.mp4" type"video/mp4" /></video>var videoElement document.getElementById("video_dom");videoElement.play();vie…

数据处理新纪元:2024热门PDF转Excel工具集

当PDF文件中的数据需要被进一步分析、编辑或应用于电子表格中时&#xff0c;将其转换为Excel格式便成为了一项不可或缺的任务。本文将为你盘点几款当前最为热门的pdf转换成excel的工具&#xff0c;帮助你轻松实现数据格式的转换&#xff0c;提升工作效率。 1.福昕PDF转换大师 …