何为备忘录模式
所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
注意事项
通过一个备忘录类专门存储对象状态。
客户不与备忘录类耦合,与备忘录管理类耦合。
为了符合迪米特原则,还要增加一个管理备忘录的类。
备忘录模式使用三个类 Memento、Originator(发起者类) 和 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(); }
如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。