备忘录模式——实现象棋悔棋

备忘录模式

想象这样的一种场景,当你在玩象棋游戏时,这个时候你可能在落子的下一秒意识到这一步棋不可以这样下,这时你的第一个反应就是点击悔棋,回到落子之前的状态。而问题是如何存储上一个状态,这个时候就可以使用设计模式中的备忘录模式。
备忘录模式分为三个对象:
Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。
三个对象各有各的功能总体来说就是发起人进行对以往的状态进行获取或者存储此时的状态,管理者则是存储着备份的状态,而备忘录就是存储状态的各种属性的一种载体,就像是发起人与管理者之间的一个桥梁,进行信息的交流。
利用这个模式就可以进行实现象棋悔棋这个功能

发起人

package shejimoshi5_21;

public class ChessGame {
      private Chess chess;

	public ChessGame(Chess chess) {
		this.chess = chess;
	}
    public void show()
    {
    	for(Pieces p:chess.getList())
    	{
    		System.out.println(p.getName()+" "+p.getX()+" "+p.getY());
    	}
    }
    
    public void saveChess(Caretaker caretaker)
    {
    	
    	Chess c=new Chess(chess.getList());
    	caretaker.add(c);
    }
    public void back(Caretaker caretaker)
    {
    	chess=caretaker.back();
    }
	public void setChess(Chess chess) {
		this.chess = chess;
	}
    
}

备忘录

public class Chess {
         private LinkedList<Pieces> list;
		public Chess(LinkedList<Pieces> lis) {
			list=new LinkedList<Pieces>();
			Pieces p2;
			Iterator<Pieces> it=lis.iterator();
			while(it.hasNext())
				{
				p2=new Pieces((Pieces)it.next());
				list.addLast(p2);
				}
			
		}

		public LinkedList<Pieces> getList() {
			return list;
		}		
}

管理者

public class Caretaker {
    private LinkedList<Chess> list;
    int a=0;
    public Caretaker() {
    	list=new LinkedList<Chess>();
	}
	public void add(Chess chess)
    {
    	list.addLast(chess);
    }
    public Chess back()
    {
    	Chess chess=list.getLast();
    	list.removeLast();
    	return chess;
    }
}

总结:上述代码在写的时候没有考虑这么多,现在写博客的时候再看一遍感觉方法暴露的太多,像是Caretaker中add和back方法可以设置成private类型,和Chess的构造函数都可以添加一个中间方法使得ChessGame可以间接使用这些方法。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不头秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值