备忘录模式

来源:互联网 发布:淘宝二手苹果 编辑:程序博客网 时间:2024/05/02 04:32


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace ConsoleApplication1

{

    class Xiangqi

    {

        //象棋中的棋子

        private string xiaobing;//小兵

        private string pao;//

        private string ma;//

        private string xiang;//

        private string ju;//

        public Memnto SaveState()//保存当前状态

        {

            return (new Memnto(xiaobing,pao,ma,xiang,ju)); //此中调用备忘录函数,将当前的各个状态保存到备忘录函数中。

        }

        public void RecoverState(Memnto memento)//悔棋函数,将上一步的状态返回。

        {

            this.ju = memento.Ju;

            this.ma = memento.Ma;

            this.pao = memento.Pao;

            this.xiang = memento.Xiang;

            this.xiaobing = memento.Xiaobing;

        }

        public void Stateplay()

        {

            Console.WriteLine("棋局当前状态:");

            Console.WriteLine("马的位置:{0}",this.ma);

            Console.WriteLine("炮的位置:{0}",this.pao);

            Console.WriteLine("小兵的位置:{0}",this.xiaobing);

            Console.WriteLine("象的位置:{0}",this.xiang);

            Console.WriteLine("车的位置:{0}",this.ju);

        }

        public void GetInitState()

        {

            this.ma = "当前";

            this.pao = "当前";

            this.xiang = "当前";

            this.xiaobing = "当前";

            this.ju = "当前";

        }

        public String Pao//恢复状态时候,供取值用。

        {

            set { pao = value; }

            get { return pao; }

        }

        public String Ma

        {

            set { ma = value; }

            get { return ma; }

        }

        public String Ju

        {

            set { ju = value; }

            get { return ju; }

        }

        public String Xiaobing

        {

            set { xiaobing = value; }

            get { return xiaobing; }

        }

        public String Xiang

        {

            set { xiang = value; }

            get { return xiang; }

        }

    }

    class Memnto//备忘录,存储上一步棋。

    {

        private string xiaobing;

        private string pao;

        private string ma;

        private string xiang;

        private string ju;

        public Memnto(String xiaobing, String pao, String ma, String xiang, String ju)//构造函数,存储状态,供xiangqi类调用。

        {

            this.pao = pao;

            this.xiang = xiang;

            this.xiaobing = xiaobing;

            this.ju = ju;

            this.ma = ma;

        }

        public String Pao//恢复状态时候,供取值用。

        {

            set { pao = value; }

            get { return pao; }

        }

        public String Ma

        {

            set { ma = value; }

            get { return ma; }

        }

        public String Ju

        {

            set { ju = value; }

            get { return ju; }

        }

        public String Xiaobing

        {

            set { xiaobing = value; }

            get { return xiaobing; }

        }

        public String Xiang

        {

            set { xiang = value; }

            get { return xiang; }

        }

 

    }

    class Caretaker//管理者模式

    {

        private Memnto memento;//创建备忘录对象

        public Memnto Memento//获取存储值。

        {

            get { return memento;}

            set { memento = value;}

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Xiangqi yjz = new Xiangqi();//创建对象

            yjz.GetInitState();//初始化棋盘

            yjz.SaveState();//保存进度

            yjz.Stateplay();//展示棋盘棋子位置

            Caretaker stateAdmin = new Caretaker();//创建管理

            stateAdmin.Memento = yjz.SaveState();//保存进度

            yjz.Ma = "马上走日";//移动棋子

            yjz.Stateplay();//展示棋盘

            yjz.RecoverState(stateAdmin.Memento);//悔棋到上一步

            yjz.Stateplay();//展示悔棋后的当前棋盘

            Console.Read();//

        }

    }

}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Xiangqi
{
//象棋中的棋子
private string xiaobing;//小兵
private string pao;//炮
private string ma;//马
private string xiang;//象
private string ju;//俥
public Memnto SaveState()//保存当前状态
{
return (new Memnto(xiaobing,pao,ma,xiang,ju)); //此中调用备忘录函数,将当前的各个状态保存到备忘录函数中。
}
public void RecoverState(Memnto memento)//悔棋函数,将上一步的状态返回。
{
this.ju = memento.Ju;
this.ma = memento.Ma;
this.pao = memento.Pao;
this.xiang = memento.Xiang;
this.xiaobing = memento.Xiaobing;
}
public void Stateplay()
{
Console.WriteLine("棋局当前状态:");
Console.WriteLine("马的位置:{0}",this.ma);
Console.WriteLine("炮的位置:{0}",this.pao);
Console.WriteLine("小兵的位置:{0}",this.xiaobing);
Console.WriteLine("象的位置:{0}",this.xiang);
Console.WriteLine("车的位置:{0}",this.ju);
}
public void GetInitState()
{
this.ma = "当前";
this.pao = "当前";
this.xiang = "当前";
this.xiaobing = "当前";
this.ju = "当前";
}
public String Pao//恢复状态时候,供取值用。
{
set { pao = value; }
get { return pao; }
}
public String Ma
{
set { ma = value; }
get { return ma; }
}
public String Ju
{
set { ju = value; }
get { return ju; }
}
public String Xiaobing
{
set { xiaobing = value; }
get { return xiaobing; }
}
public String Xiang
{
set { xiang = value; }
get { return xiang; }
}
}
class Memnto//备忘录,存储上一步棋。
{
private string xiaobing;
private string pao;
private string ma;
private string xiang;
private string ju;
public Memnto(String xiaobing, String pao, String ma, String xiang, String ju)//构造函数,存储状态,供xiangqi类调用。
{
this.pao = pao;
this.xiang = xiang;
this.xiaobing = xiaobing;
this.ju = ju;
this.ma = ma;
}
public String Pao//恢复状态时候,供取值用。
{
set { pao = value; }
get { return pao; }
}
public String Ma
{
set { ma = value; }
get { return ma; }
}
public String Ju
{
set { ju = value; }
get { return ju; }
}
public String Xiaobing
{
set { xiaobing = value; }
get { return xiaobing; }
}
public String Xiang
{
set { xiang = value; }
get { return xiang; }
}

}
class Caretaker//管理者模式
{
private Memnto memento;//创建备忘录对象
public Memnto Memento//获取存储值。
{
get { return memento;}
set { memento = value;}
}
}
class Program
{
static void Main(string[] args)
{
Xiangqi yjz = new Xiangqi();//创建对象
yjz.GetInitState();//初始化棋盘
yjz.SaveState();//保存进度
yjz.Stateplay();//展示棋盘棋子位置
Caretaker stateAdmin = new Caretaker();//创建管理
stateAdmin.Memento = yjz.SaveState();//保存进度
yjz.Ma = "马上走日";//移动棋子
yjz.Stateplay();//展示棋盘
yjz.RecoverState(stateAdmin.Memento);//悔棋到上一步
yjz.Stateplay();//展示悔棋后的当前棋盘
Console.Read();//
}
}
}
4 模式总结:
备忘录模式:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
优点:该模式把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当的保持封装边界。简化了发起人类,方便状态复原。
缺点:如果发起人的角色状态需要全部用备忘录存储,在资源消耗上备忘录会很昂贵,可存储但不可改。
若是要更改状态或者是增加状态,以上代码是不符合开放封闭的,因为所有方法都集成在了发起人类,即xiangqi类,若是有修改就给修改源码,而相应的备忘录也得修改,因为备忘录中的字段要跟发起人类的字段对应来存储属性值。所以说,该模式还要修改,用抽象方法做父类,由子类来做重构。

备忘录模式:

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

优点:该模式把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当的保持封装边界。简化了发起人类,方便状态复原。

缺点:如果发起人的角色状态需要全部用备忘录存储,在资源消耗上备忘录会很昂贵,可存储但不可改。

若是要更改状态或者是增加状态,以上代码是不符合开放封闭的,因为所有方法都集成在了发起人类,即xiangqi类,若是有修改就给修改源码,而相应的备忘录也得修改,因为备忘录中的字段要跟发起人类的字段对应来存储属性值。所以说,该模式还要修改,用抽象方法做父类,由子类来做重构。

0 0
原创粉丝点击