机房重构——撤销修改基本数据(备忘录模式)
前言:加上这个模式的感觉就是有条件要上,没条件创造条件也要上(这个后面会有解释哈),目的就是了解下这个模式。
简介
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
图例:
Originator(发起人):负责创建一个备忘录Memento,记录当前时刻它的内部状态,并可使用备忘录使用备忘录恢复内部状态
发起人可决定备忘录的内部状态。
Memento(备忘录):负责存储发起人的内部状态,防止除发起人之外的对象访问备忘录
Caretaker(管理者):负责保存好备忘录,但不能进行操作
原理:
定义一个临时存储的地方,用于存储一个对象的对象,当然这个地方可以根据需要进行多次断点保存。
实际应用
像咱们经常使用的Ctrl+z,恢复出厂设置等都使用了备忘录模式的原理,机房相当于恢复了出厂设置,恢复了数据库中原始的数据,在机房七层中,各个窗体都可以调用各个实体层的数据并进行修改,因此封装性不是很好,而在我的窗体完全可以重新打开一次窗体即可完成,这也是上面说,创造条件也要上的原因
界面:
通过点击选中行CellClick事件,实例化窗体并进行传参
代码
实体层
发起人
public class BasicdataEntity
{
//字段
private int ratemoney;
private int ratetime;
private string date;
private int limitcash;
private string userid;
//属性
public int RateMoney { get; set; }
public int RateTime { get; set; }
public string Date { get; set; }
public int LimitCash { get; set; }
public string UserID { get; set; }
//实例化备忘录,并且存入最初状态
//发起人看到备忘录的一个大接口,存储返回所需要的数据
public BasicStateMemento SaveState()
{
return (new BasicStateMemento(RateMoney,RateTime,LimitCash));
}
//恢复状态
public void RecoveryState(BasicStateMemento memento)
{
this.RateMoney = memento.RateMoney;
this.RateTime = memento.RateTime;
this.LimitCash = memento.LimitCash;
}
}
备忘录类
//备忘录
public class BasicStateMemento
{
private int ratemoney;
private int ratetime;
private int limitcash;
public BasicStateMemento(int RateMoney, int RateTime, int LimitCash)
{
this.ratemoney = RateMoney;
this.ratetime = RateTime;
this.limitcash = LimitCash;
}
//接收值,因此不能修改
public int RateMoney
{
get { return ratemoney; }
}
public int RateTime
{
get { return ratetime; }
}
public int LimitCash
{
get { return limitcash; }
}
}
备忘录管理者类
//备忘录管理者
public class BasicCaretaker
{
//定义备忘录类型字段
//管理看到备忘录的小接口,只能将备忘录的值传递出去
private BasicStateMemento memento;
public BasicStateMemento Memento
{
get { return memento; }
set { memento = value; }
}
}
UI层(客户端)
得到客户数据并传递给实体层
private void frmUpdateBasic_Load(object sender, EventArgs e)
{
//从UI层传值到实体层
basicdata.RateMoney = Convert.ToInt32(txtRateMoney.Text.Trim());
basicdata.RateTime = Convert.ToInt32(txtRatetime.Text.Trim());
basicdata.LimitCash = Convert.ToInt32(txtLimitcash.Text.Trim());
//savestate方法实例化备忘录并将状态数据传入备忘录
caretaker.Memento = basicdata.SaveState();
}
执行取消修改操作
//实例化外观,备忘录管理者,实体层
//注意写到事件的前面
Facade.BasicdataFacade facade = new Facade.BasicdataFacade();
Entity.BasicCaretaker caretaker = new Entity.BasicCaretaker();
Entity.BasicdataEntity basicdata = new Entity.BasicdataEntity();
private void btnCancelEdit_Click(object sender, EventArgs e)
{
//从备忘录中得到数据恢复状态
basicdata.RecoveryState(caretaker.Memento);
//向客户端传入恢复值
txtLimitcash.Text = basicdata.LimitCash.ToString();
txtRateMoney.Text = basicdata.RateMoney.ToString();
txtRatetime.Text = basicdata.RateTime.ToString();
}
感受
其实用完设计模式,并不能说对它完全了解了,毕竟这次多少次项目堆出来的经验,还得继续实践
参考博客:
https://blog.****.net/cd18333612683/article/details/50993468?utm_source=blogxgwz7
https://blog.****.net/qq_40369829/article/details/80370606