机房重构之备忘录模式的应用

简介: 机房重构之备忘录模式的应用

何为备忘录模式

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。


注意事项

通过一个备忘录类专门存储对象状态。

客户不与备忘录类耦合,与备忘录管理类耦合。

为了符合迪米特原则,还要增加一个管理备忘录的类。

备忘录模式使用三个类 Memento、Originator(发起者类) 和 CareTaker(管理者类)。


Memento (备忘录类):包含了要被恢复的对象的状态。


Originator(发起者类): 创建并在 Memento 对象中存储状态。


Caretaker(管理者类): 对象负责从 Memento 中恢复对象的状态。


机房重构的应用

实现思路:将备忘录模式用在了基本数据设定窗体,当窗体加载时用发起者类里创建备忘录的方法,能将数据从界面——→发起者——→备忘录(存住),单击恢复按钮时用发起者的恢复备忘录的方法得到备忘录中的数据。

image.png


首先在实体层创建一个BasicDataEntity类——发起者类

/// <summary>
/// 基本数据设定
/// </summary>
public class BasicDataEntity
{
     //VIP每小时收费
     //临时用户收费
     //至少上机时间
     //单位递增时间
     //最少金额
     private decimal vipRate;
     public decimal VipRate { get; set; }
     private decimal customerRate;
     public decimal CustomerRate { get; set; }
     private int leastTime;
     public int LeastTime { get; set; }
     private int unitTime;
     public int UnitTime { get; set; }
     public decimal minCash;
     public decimal MinCash { get; set; }
     //创建备忘录,
     public BasicDataMemento CreateMemento()
     {
            //将属性值传进备忘录
        return (new BasicDataMemento(vipRate, customerRate, leastTime, unitTime, minCash));
     }
     //恢复备忘录
     public void SetMemento(BasicDataMemento memento)
     {
         //恢复备忘录,将Memento导入并将相关数据恢复
          vipRate = memento.VipRate;
          customerRate = memento.CustomerRate;
          leastTime = memento.LeastTime;
          unitTime = memento.UnitTime;
          minCash = memento.MinCash;
     }
}

备忘录类—BasicDataMemento

/// <summary>
/// 备忘录类
/// </summary>
public  class BasicDataMemento
{
     //只读属性
     private decimal vipRate;
     public decimal VipRate { get;  }
     private decimal customerRate;
     public decimal CustomerRate { get;  }
     private int leastTime;
     public int LeastTime { get; }
     private int unitTime;
     public int UnitTime { get;  }
     public decimal minCash;
     public decimal MinCash { get; }
     //构造方法,将相关数据导入
     public BasicDataMemento(decimal vipRate, decimal customerRate, int leastTime, int unitTime,decimal minCash)
     {
         this.vipRate = vipRate;
         this.customerRate = customerRate;
         this.leastTime = leastTime;
         this.unitTime = unitTime;
         this.minCash = minCash;
     }
}

管理者类——BaiscDataCaretaker

/// <summary>
/// 管理者类
/// </summary>
public  class BaiscDataCaretaker
{
   private BasicDataMemento memento;
   //得到备忘录
   public BasicDataMemento Memento
   {
       get { return memento; }
       set { memento = value; }
   }
}

UI层,当窗体记载时,将数据传给实体层(发起者类)

//实例化发起者、管理者
Entity.Boss.BasicDataEntity originator = new Entity.Boss.BasicDataEntity();
Entity.Boss.BaiscDataCaretaker caretaker = new Entity.Boss.BaiscDataCaretaker();
private void frmBasicData_Load(object sender, EventArgs e)
{
    //实例化外观层
     Facade.SelectDataFacade facade = new Facade.SelectDataFacade();
     DataTable dt = facade.SelectData();
     //数据绑定,将数据库中的数据显示到窗体
      try
      {
          //显示到窗体
          txtVipRate.Text = dt.Rows[0]["Rate"].ToString();
          txtCustomerRate.Text = dt.Rows[0]["tmpRate"].ToString();
          txtLeastTime.Text = dt.Rows[0]["leastTime"].ToString();
          txtUnitTime.Text = dt.Rows[0]["unitTime"].ToString();
          txtMinCash.Text = dt.Rows[0]["limitCash"].ToString();
      }
      catch (Exception)
      {
           MessageBox.Show("数据未能成功加载");
      }
      //给备忘录的发起者
      //记录窗体中的初始数据
      originator.VipRate =decimal.Parse( txtVipRate.Text);
      originator.UnitTime = int.Parse(txtUnitTime.Text);
      originator.LeastTime=int.Parse(txtLeastTime.Text);
      originator.CustomerRate = decimal.Parse(txtCustomerRate.Text);
      originator.MinCash = decimal.Parse(txtMinCash.Text);
      //存进备忘录
      caretaker.Memento = originator.CreateMemento();
}

当单击恢复按钮时,将备忘录中的数据传出来

//恢复按钮
private void btnstore_Click(object sender, EventArgs e)
{
      //恢复备忘录中的数据
      originator.SetMemento(caretaker.Memento);
      txtVipRate.Text = originator.VipRate.ToString() ;
      txtUnitTime.Text = originator.UnitTime.ToString();
      txtCustomerRate.Text = originator.CustomerRate.ToString();
      txtLeastTime.Text = originator.LeastTime.ToString();
      txtMinCash.Text = originator.MinCash.ToString();
}

如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。


相关文章
|
8月前
|
人工智能 搜索推荐 Java
【重磅】JeecgBoot 里程碑 v3.8.0 发布,支持 AI 大模型、应用、AI 流程编排和知识库
JeecgBoot 最新推出了一整套 AI 大模型功能,包括 AI 模型管理、AI 应用、知识库、AI 流程编排和 AI 对话助手。这标志着其转型为 “AI 低代码平台”,旨在帮助开发者快速构建和部署个性化 AI 应用,降低开发门槛,提升效率。
394 12
|
9月前
|
人工智能 自然语言处理 PyTorch
Chat2SVG – 文本描述实现高质量矢量图形的生成框架
Chat2SVG 是一个创新的文本到矢量图形生成框架,结合大型语言模型和图像扩散模型,通过多阶段流程生成高质量的 SVG 图形,支持自然语言指令编辑,适用于设计、教育和艺术创作等领域。
483 8
Chat2SVG – 文本描述实现高质量矢量图形的生成框架
|
9月前
|
人工智能 Cloud Native Serverless
2种方式1键部署,快速体验QWQ-32B 模型
QwQ-32B 推理模型现已正式发布并开源,其卓越性能在多项基准测试中表现突出,与全球领先模型比肩。阿里云函数计算 FC 提供算力支持,Serverless+AI 云原生应用开发平台 CAP 提供两种部署方式:模型服务和应用模板,帮助用户快速部署 QwQ-32B 系列模型。用户可通过一键部署体验对话功能或以 API 形式接入 AI 应用。文档详细介绍了前置准备、部署步骤及验证方法,并提供删除项目指南以降低费用。来源:阿里云开发者公众号;作者:肯梦、折原。
2种方式1键部署,快速体验QWQ-32B 模型
|
分布式计算 Hadoop
hadoop格式化HDFS的命令
【7月更文挑战第21天】
1237 5
|
存储 数据库 数据安全/隐私保护
MVCC实现原理
【10月更文挑战第15天】MVCC 通过维护版本链和相关信息,实现了在多事务并发环境下的数据隔离和并发控制,提高了数据库的性能和可用性。
416 57
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
安全 算法 网络安全
网络安全的盾牌与剑:漏洞防御与加密技术深度解析
在数字信息的海洋中,网络安全是航行者不可或缺的指南针。本文将深入探讨网络安全的两大支柱——漏洞防御和加密技术,揭示它们如何共同构筑起信息时代的安全屏障。从最新的网络攻击手段到防御策略,再到加密技术的奥秘,我们将一起揭开网络安全的神秘面纱,理解其背后的科学原理,并掌握保护个人和企业数据的关键技能。
358 3
|
机器学习/深度学习 算法 搜索推荐
利用深度学习实现图像风格迁移
【9月更文挑战第21天】本文将介绍一种使用深度学习技术,特别是卷积神经网络(CNN)和生成对抗网络(GAN)来实现图像风格迁移的方法。我们将探索如何将这些技术应用于艺术创作,以及它们如何影响现代视觉艺术的发展。
阿里云国际版提交工单后需要多久才能解决问题
阿里云国际版提交工单后需要多久才能解决问题