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类,若是有修改就给修改源码,而相应的备忘录也得修改,因为备忘录中的字段要跟发起人类的字段对应来存储属性值。所以说,该模式还要修改,用抽象方法做父类,由子类来做重构。