当前位置 博文首页 > 小小张自由—>张有博:机房重构之备忘录模式的应用

    小小张自由—>张有博:机房重构之备忘录模式的应用

    作者:[db:作者] 时间:2021-09-14 19:47

    目录

    何为备忘录模式

    注意事项

    机房重构的应用

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

    备忘录类—BasicDataMemento

    管理者类——BaiscDataCaretaker

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

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


    何为备忘录模式

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

    注意事项

    • 通过一个备忘录类专门存储对象状态。
    • 客户不与备忘录类耦合,与备忘录管理类耦合。
    • 为了符合迪米特原则,还要增加一个管理备忘录的类。

    备忘录模式使用三个类?MementoOriginator(发起者类)?和?CareTaker(管理者类)

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

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

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

    机房重构的应用

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

    ?

    首先在实体层创建一个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();
    }

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

    cs