风动破

导航

设计模式之备忘memento

备忘录模式参与者:
  ◊ Memento 
为创建对象的各个部件指定抽象接口
防止Originator意外的其他对象访问备忘录。备忘录实际上有两个接口,
Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,
允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个Originator访问本备忘录的内部状态。
  ◊ Originator
    创建一个备忘录,记录当前时刻的内部状态。
    使用备忘录恢复内部状态。
  ◊ Caretaker
    负责保存备忘录
    不能对备忘录的内容进行操作或检查
  在备忘录模式中,Caretaker负责把Originator创建的Memento进行备份,
当需要的时候,Originator可以再使用Caretaker中保存的Memento进行恢复,
Originator中的所有状态被恢复到备份操作之前的状态。
4、备忘录模式应用分析
  备忘录模式适用情形:
  1>、必须保存一个对象在某一个时刻的部分状态,这样以后需要时才能恢复到先前的状态。
  2>、如果用一个接口来让其他对象直接得到被保存对象的内部状态,将会暴露对象的实现细节并破坏对象的封装性。
  备忘录模式特点:
  1>、保持封装边界。使用备忘录可以避免暴露一些只应由Originator管理却又必须存储在Originator之外的信息。
该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来,从而保持了封装边界。
  2>、简化Originator。在其他的保持封装性的设计中,Originator负责保持Client请求过的内部状态版本。
把所存储管理的重任交给了Originator,让Client管理它们请求的状态将会简化Originator,并使得Client工作结束时无需通知Originator。

======================================================================

 Jsp应用中,我们通常有很多表单要求用户输入,比如用户注册,需要输入姓名和Email等, 如果一些表项用户没有填写或者填写错误,我们希望在用户按"提交Submit"后,通过Jsp程序检查,发现确实有未填写项目,则在该项目下红字显示警告或错误,同时,还要显示用户刚才已经输入的表项.

 ======================================================================

 

/// <summary>

 

    /// 备忘
    /// </summary>
    public class MementoTest
    {
        public MementoTest() 
        {
            Caretaker care = new Caretaker();
            Originator ori = new Originator();
            ori.State = "aaa";
            care.State = ori.CreateBack();
            ori.State = "bbb";
            ori.SetMemento(care.State);
        }
    }
    public class Memento {
        private string state;
        public string State
        {
            get { return state; }
        }
        public Memento(string state) {
            this.state = state;
        }
    }
    /// <summary>
    /// 实体类
    /// </summary>
    public class Originator 
    {
        private string state;
        public string State
        {
            get { return state; }
            set { state = value;
            Console.WriteLine(state);
            }
        }
        public Memento CreateBack() 
        {
            return new Memento(state);
        }
        public void SetMemento(Memento state) 
        {
            this.state = state.State;
            Console.WriteLine(this.state);
        }
    }
    /// <summary>
    /// 备份
    /// </summary>
    public class Caretaker 
    {
        private Memento state;
        public Memento State
        {
            get { return state; }
            set { state = value; }
        }
    }

 

posted on 2015-04-29 18:05  风动破  阅读(91)  评论(0)    收藏  举报