cpp: Memento Pattern

2023-10-31

/*****************************************************************//**
 * \file   ActorMemento.h
 * \brief   备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef ACTORMEMENTO_H
#define ACTORMEMENTO_H
 
#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>
 
 
using namespace std;
 
 
 
 
namespace DuMementoPattern
{
 
    /// <summary>
    ///
    /// </summary>
    class ActorMemento
    {
    private:
        //
 
        /// <summary>
        /// 构造函数,用private修饰以防止在外部被随意创建
        /// </summary>
        /// <param name="life"></param>
        /// <param name="magic"></param>
        /// <param name="face"></param>
        ActorMemento(int life, int magic, int face) :mLife(life), mMagic(magic), mfaceScore(face) {}
 
    private:
        //提供一些供Fighter类来访问的接口,用private修饰防止被任意类访问
 
        /// <summary>
        /// 友元类Fighter可以访问本类的私有成员函数
        /// </summary>
        friend class ActorFighter;
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        int getLife() const { return mLife; }
        /// <summary>
        ///
        /// </summary>
        /// <param name="life"></param>
        void setLife(int life) { mLife = life; }
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        int getMagic() const { return mMagic; }
        /// <summary>
        ///
        /// </summary>
        /// <param name="magic"></param>
        void setMagic(int magic) { mMagic = magic; }
 
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        int getFaceScore() const { return mfaceScore; }
        /// <summary>
        ///
        /// </summary>
        /// <param name="face"></param>
        void getFaceScore(int face) { mfaceScore = face; }
    private:
        /// <summary>
        /// 生命值
        /// </summary>
        int mLife;   
        /// <summary>
        /// 魔法值
        /// </summary>
        int mMagic;  
        /// <summary>
        /// 颜值
        /// </summary>
        int mfaceScore; 
 
 
    };
 
}
 
#endif
 
/*****************************************************************//**
 * \file   ActorFighter.h
 * \brief   备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef ACTORFIGHTER_H
#define ACTORFIGHTER_H
 
#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>
 
#include "ActorMemento.h"
 
using namespace std;
 
 
 
 
namespace DuMementoPattern
{
 
    /// <summary>
    ///
    /// </summary>
    class ActorFighter
    {
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="life"></param>
        /// <param name="magic"></param>
        /// <param name="face"></param>
        ActorFighter(int life, int magic, int face) :mLife(life), mMagic(magic), mfaceScore(face) {}
 
 
    public:
        /// <summary>
        /// 将数据写入备忘录(创建备忘录,并在其中存储了当前状态)
        /// </summary>
        /// <returns></returns>
        ActorMemento* createMomento()
        {
            return new ActorMemento(mLife, mMagic, mfaceScore);
        }
        /// <summary>
        /// 从备忘录中恢复玩家数据
        /// </summary>
        /// <param name="pfm"></param>
        void restoreMomento(ActorMemento* pfm)
        {
            mLife = pfm->getLife();
            mMagic = pfm->getMagic();
            mfaceScore = pfm->getFaceScore();
        }
        /// <summary>
        /// 为测试目的引入的接口,设置生命值为0
        /// </summary>
        void setToDead()
        {
            mLife = 0;
        }
        /// <summary>
        /// 用于输出一些信息
        /// </summary>
        void displayInfo()
        {
            cout << "主角当前的生命值、魔法值、颜值分别为:" << mLife << "," << mMagic << "," << mfaceScore << endl;
        }
 
 
    private:
        //角色属性
        /// <summary>
        /// 生命值
        /// </summary>
        int mLife;
        /// <summary>
        /// 魔法值
        /// </summary>
        int mMagic;
        /// <summary>
        /// 颜值
        /// </summary>
        int mfaceScore;
        //......其他数据略
 
 
 
    };
 
}
 
#endif
 
/*****************************************************************//**
 * \file   ActorCareTaker.h
 * \brief   备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef ACTORCARETAKER_H
#define ACTORCARETAKER_H
 
#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>
 
#include "ActorMemento.h"
 
using namespace std;
 
 
 
 
namespace DuMementoPattern
{
 
    /// <summary>
    /// 管理者(负责人)类
    /// </summary>
    class ActorCareTaker
    {
 
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="ptmpfm"></param>
        ActorCareTaker(ActorMemento* ptmpfm) :m_pfm(ptmpfm) {} //形参是指向备忘录对象的指针
 
        /// <summary>
        /// 获取指向备忘录对象的指针
        /// </summary>
        /// <returns></returns>
        ActorMemento* getMemento()
        {
            return m_pfm;
        }
        /// <summary>
        /// 保存指向备忘录对象的指针
        /// </summary>
        /// <param name="ptmpfm"></param>
        void setMemento(ActorMemento* ptmpfm)
        {
            m_pfm = ptmpfm;
        }
    private:
        ActorMemento* m_pfm; //指向备忘录对象的指针
 
 
    };
 
}
 
#endif
 
/*****************************************************************//**
 * \file   MultipleSnapshotsCareTaker.h
 * \brief   备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef MULTIPLESNAPSHOTSCARETAKER_H
#define MULTIPLESNAPSHOTSCARETAKER_H
 
#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>
 
#include "ActorMemento.h"
 
using namespace std;
 
 
 
 
namespace DuMementoPattern
{
 
    /// <summary>
    /// 支持多个快照的负责人(管理者)类
    /// </summary>
    class MultipleSnapshotsCareTaker
    {
 
 
    public:
        /// <summary>
        /// 析构函数用于释放资源
        /// </summary>
        ~MultipleSnapshotsCareTaker()
        {
            for (auto iter = m_pfmContainer.begin(); iter != m_pfmContainer.end(); ++iter)
            {
                delete (*iter);
            } //end for
        }
        /// <summary>
        /// 保存指向备忘录对象的指针
        /// </summary>
        /// <param name="ptmpfm"></param>
        void setMemento(ActorMemento* ptmpfm)
        {
            m_pfmContainer.push_back(ptmpfm);
        }
        /// <summary>
        /// 获取指向备忘录对象的指针
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        ActorMemento* getMemento(int index)
        {
            auto iter = m_pfmContainer.begin();
            for (int i = 0; i <= index; ++i)
            {
                if (i == index)
                    return (*iter);
                else
                    ++iter;
            } //end for
            return NULL;
        }
    private:
        /// <summary>
        /// 存储备忘录对象指针的容器
        /// </summary>
        vector<ActorMemento*> m_pfmContainer;  //#include <vector>
 
 
    };
 
}
 
 
#endif
 
/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief  备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef GEOVINDU_H
#define GEOVINDU_H
 
#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>
 
#include "ActorCareTaker.h"
#include "ActorFighter.h"
#include "ActorMemento.h"
#include "MultipleSnapshotsCareTaker.h"
 
 
 
using namespace std;
 
 
 
namespace DuMementoPattern
{
 
    /// <summary>
    ///
    /// </summary>
    class GeovinDu
    {
 
    private:
 
    public:
 
        /// <summary>
        ///
        /// </summary>
        void displaySimple();
 
        /// <summary>
        ///
        /// </summary>
        void displayDuSimple();
 
    };
}
#endif
 
/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief  备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#include "GeovinDu.h"
 
 
using namespace std;
 
 
 
 
namespace DuMementoPattern
{
 
    /// <summary>
    ///
    /// </summary>
    void GeovinDu::displaySimple()
    {
        DuMementoPattern::ActorFighter* p_fighter = new DuMementoPattern::ActorFighter(800, 200, 300);
        //(1)显示主角在与BOSS飙戏之前的信息
        p_fighter->displayInfo();
 
        //(2)为主角类对象创建一个备忘录对象(其中保存了当前主角类对象中的必要信息)
        //_nmsp1::FighterMemento* p_fighterMemo = p_fighter->createMomento();
        DuMementoPattern::ActorCareTaker* pfcaretaker = new DuMementoPattern::ActorCareTaker(p_fighter->createMomento());
 
        //(3)主角与BOSS开始飙戏
        cout << "主角与BOSS开始进行激烈的飙戏------" << endl;
        p_fighter->setToDead();   //主角在与BOSS战斗中,生命值最终变成0而死亡(被BOSS击败)
        p_fighter->displayInfo(); //显示主角在与BOSS战斗之后的信息
 
        //(4)因为在与BOSS战斗之前已经通过NPC保存了游戏进度,这里模拟载入游戏进度,恢复主角类对象的数据,让其可以与BOSS再次战斗
        cout << "主角通过备忘录恢复自己的信息------" << endl;
        //p_fighter->restoreMomento(p_fighterMemo);
        p_fighter->restoreMomento(pfcaretaker->getMemento());
        p_fighter->displayInfo(); //显示主角通过备忘录恢复到战斗之前的信息
 
        //(5)释放资源
        //delete p_fighterMemo;
        delete pfcaretaker->getMemento();
        delete pfcaretaker; //新增
        delete p_fighter;
 
    }
    /// <summary>
    ///
    /// </summary>
    void GeovinDu::displayDuSimple()
    {
        DuMementoPattern::ActorFighter* p_fighter2 = new DuMementoPattern::ActorFighter(800, 200, 300);
        DuMementoPattern::MultipleSnapshotsCareTaker* pfcaretaker2 = new DuMementoPattern::MultipleSnapshotsCareTaker();
        pfcaretaker2->setMemento(p_fighter2->createMomento()); //做第一次快照吗,此快照玩家生命值为800
        p_fighter2->setToDead(); //改变主角的生命值
        pfcaretaker2->setMemento(p_fighter2->createMomento()); //做第二次快照,此快照玩家生命值为0
        p_fighter2->displayInfo(); //玩家主角生命值应该为0
        cout << "------------------" << endl;
        //当前生命值为0,恢复第一次快照,也就是恢复生命值为800 
        p_fighter2->restoreMomento(pfcaretaker2->getMemento(0));
        p_fighter2->displayInfo(); //玩家主角生命值应该恢复为800
 
        //释放资源
        delete p_fighter2;
        delete pfcaretaker2;
 
    }
 
}

调用:

/*****************************************************************//**
 * \file   ConsoleDuMementoPattern.cpp
 * \brief  备忘录模式 Memento Pattern亦称:快照、Snapshot、Memento  C++ 14
 * 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
// ConsoleDuMementoPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _UNICODE
 
#include <iostream>
#include "GeovinDu.h"
 
using namespace std;
using namespace DuMementoPattern;
 
 
 
int main()
{
    std::cout << "Hello World!涂聚文 Geovin Du\n";
    GeovinDu geovin;
 
    geovin.displaySimple();
 
    cout << "**********" << endl;
    geovin.displayDuSimple();
 
    system("pause");
 
    return 0;
}
 
 
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
 
// 入门使用技巧:
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define UNICODE

输出:

Hello World!涂聚文 Geovin Du
主角当前的生命值、魔法值、颜值分别为:800,200,300
主角与BOSS开始进行激烈的飙戏------
主角当前的生命值、魔法值、颜值分别为:0,200,300
主角通过备忘录恢复自己的信息------
主角当前的生命值、魔法值、颜值分别为:800,200,300
**********
主角当前的生命值、魔法值、颜值分别为:0,200,300
------------------
主角当前的生命值、魔法值、颜值分别为:800,200,300
请按任意键继续. . .

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cpp: Memento Pattern 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 图书管理系统C语言

    C语言简单编写图书管理系统 两种方法 链表 线性表 主要内容 开发一个图书管理系统 基本信息包括图书的书名 作者 ISBN号 基本实现 输出 输入 删除 查询 插入的基本功能 代码如下 运行结果省略 链表 include
  • 《CTFshow-Web入门》03. Web 21~30

    Web 21 30 索引 web21 题解 原理 web22 题解 原理 web23 题解 原理 web24 题解 原理 web25 题解 原理 web26 题解 web27 题解 web28 题解 web29 题解 原理 web30 题解
  • 【C#基础】C# 文件与IO

    序号 系列文章 9 C 基础 C 异常处理操作 10 C 基础 C 正则表达式 11 C 基础 C 预处理器指令 文章目录 前言 1 文件和IO的概念 2 文本文件操作 2 1 File 类 2 2 FileInfo 类 2 3 FileS
  • 不要消费信任

    消费是一种用来满足人们各种需求的过程 人们可以通过消费来满足吃 穿 住 行等物质上的需求 同样的 人们也可以通过消费来满足非物质需求 如 消费人情 权力等 当今世界 消费 是一种需要 而会消费 是一种艺术 但无论怎样 有一种 物品 是绝对经
  • xctf攻防世界 MISC高手进阶区 low

    1 进入环境 下载附件 给出的一张bmp图片 没有其他信息 2 问题分析 扔进binwalk中 没有发现有用信息 使用zsteg 没有有用信息 塞入StegSolve中 发现有点猫腻 如图 有点二维码的感觉 emmm 需要像素处理 但不知道
  • css 获取当前类的子类,删除子类列表项的CSS类属性

    我一直试图在Html中创建一个无序列表 css类将附加 ul 元素及其子元素 li 元素 问题是如果另一个 无序列表 成为这个父无序列表的子元素 删除子类列表项的CSS类属性 我创建了下面的示例 以显示我的问题 的Javascript fu
  • 超详解“二分法查找”,一看就会!

    目录 一 二分法概念用途 二 超详思维图解 三 超详使用方法实现代码运行操作 四 总结 五 结语 一 二分法概念用途 什么是二分法 有什么作用 一般用在何处 概念 二分查找法算法 也叫折半查找算法 对半处理会提高寻找目标数字的效率 作用 在
  • 计算机视觉——图像增强

    图像增强的定义非常广泛 一般来说 图像增强是有目的地强调图像的整体或局部特性 例如改善图像的颜色 亮度和对比度等 将原来不清晰的图像变得清晰或强调某些感兴趣的特征 扩大图像中不同物体特征之间的差别 抑制不感兴趣的特征 提高图像的视觉效果 传
  • “范式杯”2023牛客暑期多校训练营10

    K First Last 一共有n个人 然后每一局拿到第一名或者最后一名的概率为2 n 然后连续m局拿到第一名或者最后一名的概率为pow 2 n m 特判一下当n为1时 拿第一名或者最后一名的概率为1 注意 输出1时要写1 0 写1的话就w
  • Jinja 2模板引擎

    如何使用Flask渲染摸板 在模板中传递一个或多个参数 if 语句在摸板中的使用 for 语句在模板中的使用 Flask 提供了Jiaja 2模板引擎渲染模板 下面逐步介绍其模板渲染机制 templates index html user
  • Phpstorm 插件

    Symfony Plugin 支持 Symfony 2 3 4 Laravel Plugin 支持 Laravel env files support 支持 env 文件BashSupport 支持 BashEditorConfig 支持
  • 【低功耗蓝牙】⑤ 蓝牙HID协议

    摘要 本文章主要介绍了蓝牙HID协议的实现方法 基于ESP32平台实现了蓝牙键盘 蓝牙鼠标 蓝牙自拍杆和蓝牙游戏手柄等设备 是初学者学习BLE HID协议很好的参考文章 HID设备 HID Human Interface Device 人体
  • golang 判断 interface{} 是否为nil

    问题描述 当函数返回值是interface 时 需要判断是不是返回值是不是nil func check interface return nil func main c check if c nil reflect ValuOf c IsN
  • IDEA Android用户登录页面、登录验证、页面跳转演示示例全部源码

    开发工具 IDEA 2022 3 2 未连接数据库 验证用的用户名和密码为内置硬编码 演示程序运行效果 设计器中的用户登录页面布局 登录验证容错提示如下 1 用户名不能为空 2 密码不能为空 3 用户名不存在 4 用户密码错误 5 登录验证
  • lol峡谷之巅区服务器位置,LOL峡谷之巅专区申请地址一览 峡谷之巅介绍

    峡谷之巅 超级专区是英雄联盟官方搭建的 只提供给钻石I 超凡大师 最强王者的玩家及现役战队选手的公平竞技大区 在 峡谷之巅 中 各个服务器的顶级强者及现役战队选手将会共同进行召唤师峡谷的单人排位角逐 该大区的核心宗旨 进一步提升英雄联盟高端
  • 低频能不能采到高频?采样定理指导硬件设计

    原文来自公众号 工程师看海 香浓采样定理或者说奈奎斯特采样定理告诉我们 要以信号频率2倍以上的采样率对该信号进行采样 否则会出现频率混叠 比如对1Khz信号进行采样的话 采样率要高于2Ksps 采样定理与傅里叶变换的具体原理请见往期文章 h
  • Could not create task ‘:app:minifyReleaseWithR8‘. Cannot query the value of this provider because it

    重新部署AndroidStudio发现项目报错 Could not create task app minifyReleaseWithR8 Cannot query the value of this provider because it
  • 性能测试工具LoadRunner —— 性能测试流程及结果分析

    性能测试目的 1 什么是性能测试 性能测试是通过性能的测试工具模拟多种正常 峰值以及异常负载条件来对系统的各项性能指标进行测试 负载测试和压力测试都属于性能测试 两者可以结合进行 通过负载测试 确定在各种工作负载下系统的性能 目标是测试当负
  • mac环境下Maven实现ProtoBuf编译

    mac环境下Maven实现protobuf编译 1 Maven项目创建 File gt new gt Project gt 输入项目名称 gt finish 2 在项目中创建proto目录 该目录用来保存 proto文件 此处将proto目
  • cpp: Memento Pattern

    file ActorMemento h brief 备忘录模式 Memento Pattern亦称 快照 Snapshot Memento C 14 2023年6月6日 涂聚文 Geovin Du Visual Studio 2022 ed