机房重构——撤销修改基本数据(备忘录模式)

前言:加上这个模式的感觉就是有条件要上,没条件创造条件也要上(这个后面会有解释哈),目的就是了解下这个模式。


简介


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

图例:

机房重构——撤销修改基本数据(备忘录模式)

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