Browse Source

V0.6.3
1、先添加了一些设计模式

Apple 2 weeks ago
parent
commit
5a591b8001

+ 2 - 2
CMakeLists.txt

@@ -151,8 +151,8 @@ file(GLOB GLOBAL_SRC
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/time)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayer)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/xlsx)
-# add_subdirectory(${CMAKE_SOURCE_DIR}/demo/DesignerPattern)
+add_subdirectory(${CMAKE_SOURCE_DIR}/demo/DesignerPattern)
 # add_subdirectory(${CMAKE_SOURCE_DIR}/demo/ViewModel)
-add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayerGL)
+# add_subdirectory(${CMAKE_SOURCE_DIR}/demo/VideoPlayerGL)
 
 

+ 109 - 0
demo/DesignerPattern/Adapter/Adapter.h

@@ -0,0 +1,109 @@
+#ifndef ADAPTER_H
+#define ADAPTER_H
+
+#include "spdlog/spdlog.h"
+#include <string>
+
+
+/* 强盗类 */
+class Foreigner
+{
+public:
+    /* 忏悔 */
+    virtual std::string confession() = 0;
+    void setResult(std::string result)
+    {
+        SPDLOG_INFO("熊猫说:{}", result);
+    }
+    virtual ~Foreigner() {}
+};
+
+/* 美国人 */
+class American : public Foreigner
+{
+public:
+    std::string confession() override
+    {
+        return "我是美国人,我是强盗";
+    }
+
+};
+
+/* 法国人 */
+class French : public Foreigner
+{
+public:
+std::string confession() override
+    {
+        return "我是法国人,我是强盗";
+    }
+};
+
+/* 熊猫类 */
+class Panda
+{
+public:
+    void receiveMsg(std::string& msg)
+    {
+        SPDLOG_INFO("熊猫收到消息:{}", msg);
+    }
+    std::string sendMsg()
+    {
+        return "强盗、凶手、罪人是不可能被宽恕和原谅的!";
+    }
+};
+
+
+/* 抽象翻译类 */
+class AbstractTranslator
+{
+public:
+    AbstractTranslator(Foreigner* foreigner) : m_foreign(foreigner) {}
+    virtual ~AbstractTranslator() {}
+    virtual void translateToForeigner() = 0;
+    virtual void translateToPanda() = 0;
+
+protected:
+    Foreigner* m_foreign = nullptr;
+    Panda m_panda;
+};
+
+/* 英语适配器翻译机 */
+class EnglishAdapter : public AbstractTranslator
+{
+public:
+    /* 继承父类的所有构造函数 */
+    using AbstractTranslator::AbstractTranslator;
+    void translateToForeigner() override
+    {
+        std::string msg = m_panda.sendMsg();
+        m_foreign->setResult(msg);
+    }
+    void translateToPanda() override
+    {
+        std::string msg = m_foreign->confession();
+        m_panda.receiveMsg(msg);
+    }
+
+};
+
+/* 法语适配器翻译机 */
+class FrenchAdapter : public AbstractTranslator
+{
+public:
+    /* 继承父类的所有构造函数 */
+    using AbstractTranslator::AbstractTranslator;
+    void translateToForeigner() override
+    {
+        std::string msg = m_panda.sendMsg();
+        m_foreign->setResult(msg);
+    }
+    void translateToPanda() override
+    {
+        std::string msg = m_foreign->confession();
+        m_panda.receiveMsg(msg);
+    }
+
+};
+
+#endif /* APADTER_H */

+ 69 - 0
demo/DesignerPattern/Builder/Builder.cpp

@@ -0,0 +1,69 @@
+
+#include "Builder.h"
+#include "spdlog.h"
+
+
+void buildSunnyShip()
+{
+    ShipFactory* factory = new ShipFactory();
+    SunnyShipBuilder* builder = new SunnyShipBuilder();
+    factory->setBuilder(builder);
+
+    /* 创建简约型 */
+    factory->builderSimpleShip();
+    SunnyShip* ship = builder->getShip();
+    SPDLOG_INFO("Sunny简约型:");
+    ship->ShowParts();
+    delete ship;
+
+    /* 创建标准型 */
+    builder->reset();
+    factory->builderStandardShip();
+    ship = builder->getShip();
+    SPDLOG_INFO("Sunny标准型:");
+    ship->ShowParts();
+    delete ship;
+
+    /* 创建豪华型 */
+    builder->reset();
+    factory->builderRegalShip();
+    ship = builder->getShip();
+    SPDLOG_INFO("Sunny豪华型:");
+    ship->ShowParts();
+    delete ship;
+
+}
+
+/* 创建Merry号 */
+void buildMerryShip()
+{
+    ShipFactory* factory = new ShipFactory();
+    MerryShipBuilder* builder = new MerryShipBuilder();
+    factory->setBuilder(builder);
+
+    /* 创建简约型 */
+    factory->builderSimpleShip();
+    MerryShip* ship = builder->getShip();
+    SPDLOG_INFO("Merry简约型:");
+    ship->ShowParts();
+    delete ship;
+
+    /* 创建标准型 */
+    builder->reset();
+    factory->builderStandardShip();
+    ship = builder->getShip();
+    SPDLOG_INFO("Merry标准型:");
+    ship->ShowParts();
+    delete ship;
+
+    /* 创建豪华型 */
+    builder->reset();
+    factory->builderRegalShip();
+    ship = builder->getShip();
+    SPDLOG_INFO("Merry豪华型:");
+    ship->ShowParts();
+    delete ship;
+}
+
+
+

+ 264 - 0
demo/DesignerPattern/Builder/Builder.h

@@ -0,0 +1,264 @@
+#ifndef BUILDER_H
+#define BUILDER_H
+
+
+/**
+ * @file Builder.h
+ * @author your name (you@domain.com)
+ * @brief 
+ * @version 0.1
+ * @date 2025-02-22
+ * 
+ * @copyright Copyright (c) 2025
+ * 
+ */
+
+
+ /**
+ * 建造者模式
+ *      1. 建造者模式有一个抽象生成器父类,定义了产品的创建接口
+ *      2. 有n个具体生成器类,实现了抽象生成器父类的接口,负责创建产品的各个部件
+ *      3. 有一个指挥者类,负责调用生成器类的接口,生成产品
+ *      4. 有一个产品类,包含了产品的各个部件
+ * 
+ */
+
+
+
+#include <vector>
+#include <map>
+
+#include "spdlog/spdlog.h"
+
+/* ====================================================
+ * 创建两个产品类,存放生成的每个部件
+ * ==================================================== */
+
+
+class SunnyShip
+{
+
+public:
+    SunnyShip() {}
+    ~SunnyShip() {}
+
+    /* 添加部件 */
+    void addPart(const std::string& part)
+    {
+        m_parts.push_back(part);
+    }
+    /* 展示部件 */
+    void ShowParts()
+    {
+        for (auto part : m_parts)
+        {
+            SPDLOG_INFO("Part: {}", part);
+        }
+    }
+
+private:
+    std::vector<std::string> m_parts;
+
+};
+
+/**
+ * @brief 美丽号零件有区别,使用map来存储
+ * 
+ */
+class MerryShip
+{
+
+public:
+    MerryShip() {}
+    ~MerryShip() {}
+
+    /* 添加部件,键是部件材料,值是部件名称 */
+    void addPart(const std::string& name, const std::string& part)
+    {
+        m_parts.insert(std::make_pair(name, part));
+    }
+    /* 展示部件 */
+    void ShowParts()
+    {
+        for (auto part : m_parts)
+        {
+            SPDLOG_INFO("{}:{}", part.first, part.second);
+        }
+    }
+
+private:
+    std::map<std::string, std::string> m_parts;     /* 部件材料和部件名称 */
+
+};
+
+
+/* ====================================================
+ * 创建一个抽象生成器父类,定义了产品的创建接口
+ * ==================================================== */
+
+class ShipBuilder
+{
+public:
+    virtual ~ShipBuilder() {}
+    virtual void reset() = 0;
+    virtual void buildBody() = 0;       /* 创建船体 */
+    virtual void buildEngine() = 0;     /* 创建引擎 */
+    virtual void buildWeapon() = 0;     /* 创建武器 */
+    virtual void buildInterior() = 0;   /* 创建内饰 */
+};
+
+/**
+ * @brief Sunny号生成器
+ * 
+ */
+ class SunnyShipBuilder : public ShipBuilder
+ {
+public:
+    SunnyShipBuilder() { reset(); }
+    ~SunnyShipBuilder() 
+    {
+        if(m_ship != nullptr)
+        {
+            delete m_ship;
+        }
+    }
+
+    void reset() override
+    {
+        m_ship = new SunnyShip();
+    }
+    void buildBody() override
+    {
+        m_ship->addPart("Sunny Body");
+    }
+    void buildEngine() override
+    {
+        m_ship->addPart("Sunny Engine");
+    }
+    void buildWeapon() override
+    {
+        m_ship->addPart("Sunny Weapon");
+    }
+    void buildInterior() override
+    {
+        m_ship->addPart("Sunny Interior");
+    }
+    /* 提供一个获取船的接口 */
+    SunnyShip* getShip()
+    {
+        SunnyShip* ship = m_ship;
+        m_ship = nullptr;
+        return ship;
+    }
+
+private:
+    SunnyShip* m_ship = nullptr;
+
+ };
+
+ /**
+  * @brief Merry号生成器
+  * 
+  */
+
+class MerryShipBuilder : public ShipBuilder
+{
+public:
+    MerryShipBuilder() { reset(); }
+    ~MerryShipBuilder() 
+    {
+        if(m_ship != nullptr)
+        {
+            delete m_ship;
+        }
+    }
+
+    void reset() override
+    {
+        m_ship = new MerryShip();
+    }
+    void buildBody() override
+    {
+        m_ship->addPart("Wood", "Merry Body");
+    }
+    void buildEngine() override
+    {
+        m_ship->addPart("Iron", "Merry Engine");
+    }
+    void buildWeapon() override
+    {
+        m_ship->addPart("Cannon", "Merry Weapon");
+    }
+    void buildInterior() override
+    {
+        m_ship->addPart("Gold", "Merry Interior");
+    }
+    /* 提供一个获取船的接口 */
+    MerryShip* getShip()
+    {
+        MerryShip* ship = m_ship;
+        m_ship = nullptr;
+        return ship;
+    }
+
+
+
+private:
+    MerryShip* m_ship = nullptr;
+
+};
+
+/* ====================================================
+ * 创建一个船厂(主管),生成不同类型的船
+ * ==================================================== */
+
+class ShipFactory
+{
+    
+public:
+    ShipFactory() {}
+    ~ShipFactory() {}
+
+    /* 设置Builder */
+    void setBuilder(ShipBuilder* builder)
+    {
+        m_builder = builder;
+    }
+    /* 建造简约型的船 */
+    void builderSimpleShip()
+    {
+        m_builder->buildBody();
+        m_builder->buildEngine();
+    }
+
+    /* 建造标准型的船 */
+    void builderStandardShip()
+    {
+        builderSimpleShip();
+        m_builder->buildWeapon();
+    }
+
+    /* 建造豪华型的船 */
+    void builderRegalShip()
+    {
+        builderStandardShip();
+        m_builder->buildInterior();
+    }
+
+public:
+    ShipBuilder* m_builder = nullptr;
+
+};
+
+/* ====================================================
+ * 创建船,使用全局函数来创建
+ * ==================================================== */
+
+ /* 创建Sunny号 */
+void buildSunnyShip();
+/* 创建Merry号 */
+void buildMerryShip();
+
+
+
+#endif // BUILDER_H

+ 2 - 0
demo/DesignerPattern/CMakeLists.txt

@@ -12,6 +12,7 @@ file(GLOB LOCAL_SRC
     ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/*.ui
     ${CMAKE_CURRENT_SOURCE_DIR}/AbstractFactory/*.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/Builder/*.cpp
 )
 
 
@@ -34,6 +35,7 @@ target_include_directories(${this_exe} PRIVATE
     ${CMAKE_SOURCE_DIR}/External/module/Logs
 
     ${CMAKE_CURRENT_SOURCE_DIR}/AbstractFactory
+    ${CMAKE_CURRENT_SOURCE_DIR}/Builder
 
     ${spdlog_INCLUDE_DIR}
 )

+ 47 - 0
demo/DesignerPattern/Prototype/Prototype.h

@@ -0,0 +1,47 @@
+#ifndef PTOTOTYPE_H
+#define PTOTOTYPE_H
+
+#include "spdlog/spdlog.h"
+
+class GermaSoldier
+{
+
+public:
+    GermaSoldier() {}
+    virtual ~GermaSoldier() {}
+
+    /* 克隆 */
+    virtual GermaSoldier* clone() = 0;
+    /* 展示 */
+    virtual void show() = 0;
+
+};
+
+
+class Soldier66 : public GermaSoldier
+{
+
+public:
+    Soldier66() {}
+    Soldier66(const Soldier66& other) {}
+    ~Soldier66() {}
+
+    /* 克隆 */
+    GermaSoldier* clone() override
+    {
+        /* 注意,这个实现需要依赖拷贝构造函数,注意拷贝构造函数的深拷贝和浅拷贝问题 */
+        return new Soldier66(*this);
+    }
+
+    void show() override
+    {
+        SPDLOG_INFO("Soldier66");
+    }
+
+};
+
+
+
+
+#endif /* Prototype */
+

+ 34 - 4
demo/DesignerPattern/main.cpp

@@ -1,9 +1,13 @@
+#include "spdlog.h"
 #include "widget.h"
 
 #include <QApplication>
 #include "loginit.h"
 
 #include "AbstractFactory/AbstractFactory.h"
+#include "Builder/Builder.h"
+#include "Prototype/Prototype.h"
+#include "Adapter/Adapter.h"
 
 
 int main(int argc, char *argv[])
@@ -12,10 +16,36 @@ int main(int argc, char *argv[])
     init_log();
     
     /* 建造一艘旗舰战船 */
-    AbstractFactory* factory = new FactoryUltimate();
-    Ship* ship = factory->createShip();
-    ship->showShip();
+    // AbstractFactory* factory = new FactoryUltimate();
+    // Ship* ship = factory->createShip();
+    // ship->showShip();
+    // delete ship;
+
+    /* 创建6中不同的船 */
+    // buildSunnyShip();
+    // SPDLOG_INFO("==============================================");
+    // buildMerryShip();
+
+    // Soldier66* soldier66 = new Soldier66();
+    // soldier66->show();
+    // GermaSoldier* soldier66_clone = soldier66->clone();
+    // soldier66_clone->show();
+    // delete soldier66;
+    // delete soldier66_clone;
+
+    Foreigner* american = new American();
+    AbstractTranslator* translator = new EnglishAdapter(american);
+    translator->translateToPanda();
+    translator->translateToForeigner();
+    delete translator;
+    delete american;
+
+    Foreigner* french = new French();
+    translator = new FrenchAdapter(french);
+    translator->translateToPanda();
+    translator->translateToForeigner();
+    delete translator;
+    delete french;
 
-    delete ship;
     return a.exec();
 }